Javaでその場でだせる例外まとめ

プロになるJava」では、かなり最初のほうでゼロによる除算を行って例外の説明をしています。

jshell> 3/0
|  例外java.lang.ArithmeticException: / by zero
|        at (#1:1)

JShellでゼロ除算を行ったときの例外は、その場で発生しているためスタックトレースが出ません。
最初に体験する例外として最適です。

で、他には何があるだろうって考えてみました。

まずはその場で例外オブジェクトの生成

jshell> throw new Exception()
|  例外java.lang.Exception
|        at (#2:1)

定番のぬるぽ

jshell> (int)(Integer)null
|  例外java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "null" is null
|        at (#3:1)

throw nullのほうが手軽で美しいですね( @iso2022jp さんから)

jshell> throw null
|  例外java.lang.NullPointerException: Cannot throw exception because "null" is null
|        at (#1:1)

ダウンキャストの失敗

jshell> (int) new Object()
|  例外java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.Integer (java.lang.Object and java.lang.Integer are in module java.base of loader 'bootstrap')
|        at (#4:1)

配列シリーズで、要素からはみだしたアクセス

jshell> (new int[0])[0]
|  例外java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
|        at (#5:1)

マイナスの要素数をもった配列を生成しようとする

jshell> new int[-1]
|  例外java.lang.NegativeArraySizeException: -1
|        at (#6:1)

メモリが足りない

jshell> new int[Integer.MAX_VALUE]
|  例外java.lang.OutOfMemoryError: Requested array size exceeds VM limit
|        at (#7:1)

そして @mick_neckさんによる、配列の型システムの不具合をついたやつ。

jshell> ((Object[])(new Integer[1]))[0] = "foo"
|  例外java.lang.ArrayStoreException: java.lang.String
|        at (#8:1)

@YujiSoftwareさんに言語仕様上のまとめおしえてもらいました。
https://docs.oracle.com/javase/specs/jls/se18/html/jls-15.html#jls-15.6

あとはメソッド定義を削除してそのクラスだけコンパイルしなおすとか、不正なバイナリを作ったときに出る例外かな。

2023/2/3 追記 assertがあった!