これを実行する場合:
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 IDEA 12は、e instanceof NullPointerException
という行が常にfalseであることを示しています。それはまったく真実ではありません。
null
がNullPointerException
として扱われるのではなく、throw null
itselfを試みる行為がNullPointerException
をスローするようです。
つまり、throw
は引数がnullでないことを確認し、nullの場合はNullPointerException
をスローします。
JLS 14.18 指定 この動作:
Expressionの評価が正常に完了し、null値が生成された場合、nullクラスのインスタンスV 'が作成され、nullの代わりにスローされます。 throwステートメントは、値V 'のthrowであるため、突然完了します。
なぜNullPointerExceptionにアップキャストするのですか?
Throwステートメントは、最初に式を評価します。式の評価が何らかの理由で突然終了した場合、スローはその理由で突然終了します。式の評価が正常に完了して非ヌル値Vが生成されると、throwステートメントは突然終了します。その理由は、値Vのスローです。式の評価が正常に完了した場合、生成null値の場合、クラスNullPointerExceptionのインスタンスV 'が作成され、nullの代わりにスローされます。throwステートメントは、値V'のスローであるため、突然完了します。
Javaにnullをスローできるのはなぜですか?
タイプThrowable
のオブジェクトをスローできます。null
はThrowable
の有効な参照であるため、コンパイラーはそれを許可します。
これが ニールガフターが言う
nullはすべての参照型に割り当てることができますが、nullの型自体は参照型ではありません。 throw文の式が参照型であるという要件は、JLSの第3版から削除されるべきであるという意図でしたが、その変更は実際には公開版にはなりませんでした。したがって、これはSE 5で紹介したjavacコンパイラのバグです。
JLS に準拠して動作します。
Expressionの評価が正常に完了し、null値が生成された場合、nullクラスのインスタンスV 'が作成され、nullの代わりにスローされます。
このように考えると、なぜこれが機能するのかが少しわかりやすくなります。
try {
Exception foo = null;
if(false) {
foo = new FileNotFoundException();
} // Oops, forgot to set foo for the true case..
throw foo;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
確かにわからないが、私はその「nullを投げる」と推測している。 not workを実行すると、プログラムが例外をスローし、その例外は(ドラムロール)NullPointerException ...