これを実行すると:
public class WhatTheShoot {
public static void main(String args[]){
try {
throw null;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
}
}
応答は次のとおりです。
true
false
これは私にとってはかなり驚きでした。コンパイル時エラーが発生すると思っていました。
Java で null をスローできるのはなぜですか? また、nullPointerException にアップキャストされるのはなぜですか?
(実際、null をスローしているので、それが「アップキャスト」であるかどうかはわかりません)
本当に本当に馬鹿げた面接の質問(面接でこんなことを聞かないでください)を除けば、そうする理由が見つかりませんthrow null
。あなたは解雇されたいと思っているかもしれませんが、それは...つまり、他に誰がそうするでしょうかthrow null
?
楽しい事実 IntelliJ IDEA12 は、私の線 はe instanceof NullPointerException
常に偽であることを示しています。これはまったく真実ではありません。
ベストアンサー1
null
が として扱われるのではなくNullPointerException
、 を試みる動作throw null
自体がをスローするようですNullPointerException
。
つまり、throw
引数が null でないかどうかをチェックし、null の場合は をスローしますNullPointerException
。
JLS 14.18指定するこの動作:
Expression の評価が正常に完了し、null 値が生成された場合は、null の代わりに NullPointerException クラスのインスタンス V' が作成され、スローされます。その後、throw ステートメントは、値 V' の throw が原因で突然完了します。