Hatena::ブログ(Diary)

裏紙

 | 

2012-07-28

例外投げ祭り

| 23:07

これは変態アドベントカレンダー in Summerの14日目です。前日は@さんのちかんの思い出でした。

今回はJavaSEのAPIを色々使ってjava.langパッケージ以下にある例外のうち基底クラスっぽいException、ReflectiveOperationException、RuntimeExceptionの三つを除いたものを投げまくってみようと思います。

夏と言えば祭りですね。

というわけで、例外投げ祭り、開催です。

祭り


セイッ!

@Test(expected = ArithmeticException.class)
public void ゼロで叩き割る() throws Exception {
    int a = 1 / 0;
}

とりゃ!

@Test(expected = ArrayIndexOutOfBoundsException.class)
public void 範囲超えとるで_配列() throws Exception {
    Object o = (new Object[0])[0];
}

ほいっ!

@Test(expected = ArrayStoreException.class)
public void 型危険() throws Exception {
    Object[] os = new Integer[1];
    os[0] = "(・´з`・)";
}

どっせいっ!

@Test(expected = ClassCastException.class)
public void そんなキャストで大丈夫か() throws Exception {
    Object o = 1;
    String s = (String) o;
}

しゃー!

@Test(expected = ClassNotFoundException.class)
public void そんなクラスは無い() throws Exception {
    Class.forName("(゚∀゚)");
}

このやろー!

@Test(expected = CloneNotSupportedException.class)
public void 分身できません() throws Exception {
    new Thread() {

        public void execute() throws Exception {
            clone();
        }
    }.execute();
}

げふっ……

@Test(expected = EnumConstantNotPresentException.class)
public void そんな子はいません_列挙() throws Exception {
}

うりゃー!

@Test(expected = IllegalAccessException.class)
public void お触り禁止() throws Exception {
    String.class.getDeclaredField("value").set("", new char[0]);
}

ほいさっ!

@Test(expected = IllegalArgumentException.class)
public void こんなURIはダメ() throws Exception {
    new File(new URI(""));
}

どりゃー!

@Test(expected = IllegalMonitorStateException.class)
public void 待つことすら許されぬ() throws Exception {
    Object o = new Object();
    o.wait();
}

ふんっ!

@Test(expected = IllegalStateException.class)
public void 状態が変じゃよ() throws Exception {
    new ArrayList<>().iterator().remove();
}

まだまだー!

@Test(expected = IllegalThreadStateException.class)
public void スレッドの状態がアレ() throws Exception {
    Thread t = new Thread();
    t.start();
    t.start();
}

ぬおー!

@Test(expected = IndexOutOfBoundsException.class)
public void 範囲超えとるで_コレクション() throws Exception {
    Collections.emptyList().get(0);
}

どるぁー!

@Test(expected = InstantiationException.class)
public void インスタンス化できねー() throws Exception {
    int.class.newInstance();
}

にゃー!

@Test(expected = InterruptedException.class)
public void 横から失礼() throws Exception {
    Thread.currentThread().interrupt();
    Thread.sleep(0L);
}

わんわん!

@Test(expected = NegativeArraySizeException.class)
public void マイナスサイズの配列の謎() throws Exception {
    Object[] os = new Object[-1];
}

ガオー!

@Test(expected = NoSuchFieldException.class)
public void そんなフィールドは無い() throws Exception {
    getClass().getField("(´∀`)");
}

オラオラオラオラ!

@Test(expected = NoSuchMethodException.class)
public void そんなメソッドは無い() throws Exception {
    getClass().getMethod("(・∀・)");
}

無駄無駄無駄無駄!

@Test(expected = NullPointerException.class)
public void ぬるぽっ() throws Exception {
    Object o = null;
    o.toString();
}

ボラボラボラボラ!

@Test(expected = NumberFormatException.class)
public void いつから数字だと錯覚していた() throws Exception {
    Integer.parseInt("(^ω^)");
}

アリアリアリアリ!

@Test(expected = SecurityException.class)
public void セキュリティ的にアレ() throws Exception {
    new ClassLoader() {

        public void run() {
            defineClass("java.lang.String", new byte[0], 0, 0);
        }
    }.run();
}

もういっちょー!

@Test(expected = StringIndexOutOfBoundsException.class)
public void 範囲超えとるで_文字列() throws Exception {
    "".substring(1);
}

げふぅ……

@Test(expected = TypeNotPresentException.class)
public void そんな子はいません_クラス() throws Exception {
}

ぬおおおおおお!!

@Test(expected = UnsupportedOperationException.class)
public void サポート外です() throws Exception {
    CopyOnWriteArrayList<Object> list = new CopyOnWriteArrayList<>();
    list.add(new Object());
    list.iterator().remove();
}

祭り終了!!

まとめ

24例外中、22例外を投げることができました。

かなり基本的なAPIで投げまくれることが分かりました。

ただEnumConstantNotPresentExceptionとTypeNotPresentExceptionはリフレクションでなんとかなりそうな気はするのですが結局投げ方が分かりませんでした。

投げれるひとが居れば教えて頂きたく。


明日は@さんです。

tm_sendatm_senda 2012/07/29 02:27 こんな感じでどうでしょうか?

@Test(expected = EnumConstantNotPresentException.class)
public void そんな子はいません_列挙() throws Exception {
URL resource = getClass().getClassLoader().getResource(
そんな子はいません_Class.class.getName().replace('.', '/') + ".class");
final byte[] bytes = Files.readAllBytes(Paths.get(resource.toURI()));
byte[] name = "ABC".getBytes();
for (int i = 0; i < bytes.length; i++) {
if (Arrays.equals(Arrays.copyOfRange(bytes, i, i + name.length),
name)) {
bytes[i] = (byte) (name[0] + 1);
break;
}
}
new ClassLoader() {
public Class<?> get() {
return defineClass(そんな子はいません_Class.class.getName(), bytes, 0,
bytes.length);
}
}.get().getAnnotation(そんな子はいません_Annotation.class).value();
}

@Test(expected = TypeNotPresentException.class)
public void そんな子はいません_クラス() throws Exception {
URL resource = getClass().getClassLoader().getResource(
そんな子はいません_Class.class.getName().replace('.', '/') + ".class");
final byte[] bytes = Files.readAllBytes(Paths.get(resource.toURI()));
byte[] name = "そんな子はいません_Enum".getBytes();
for (int i = 0; i < bytes.length; i++) {
if (Arrays.equals(Arrays.copyOfRange(bytes, i, i + name.length),
name)) {
bytes[i] = (byte) (name[0] + 1);
break;
}
}
new ClassLoader() {
public Class<?> get() {
return defineClass(そんな子はいません_Class.class.getName(), bytes, 0,
bytes.length);
}
}.get().getAnnotation(そんな子はいません_Annotation.class).value();
}

@そんな子はいません_Annotation(そんな子はいません_Enum.ABC)
public static class そんな子はいません_Class {
}

@Retention(RetentionPolicy.RUNTIME)
public static @interface そんな子はいません_Annotation {
そんな子はいません_Enum value();
}

public enum そんな子はいません_Enum {
ABC, DEF, GHI,
}

backpaper0backpaper0 2012/07/29 12:27 なるほど! これはすごい!
勉強になりました!

 |