Java で null をスローできるのはなぜですか? [重複] 質問する

Java で null をスローできるのはなぜですか? [重複] 質問する

これを実行すると:

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 が原因で突然完了します。

おすすめ記事