1. ホーム

[解決済み】なぜJavaでnullを投げることができるのですか?[重複)。

2022-03-28 19:43:40

質問

これを実行すると

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を投げているので、quot;upcast"かどうかは分かりませんが)

本当に本当にくだらない面接の質問を除けば(頼むから面接でこんなこと聞かないでくれ)、私は以下のような理由が見当たりません。 throw null . クビになりたいのかもしれないけど、それは......。つまり、なぜ他の人が throw null ?

楽しい事実 IntelliJ IDEA 12が教えてくれたのは、私のセリフ。 e instanceof NullPointerException は常に偽になります。これは全く真実ではありません。

どうすれば解決するの?

というわけではなさそうです。 null として扱われます。 NullPointerException を行おうとする行為であること。 throw null それ自体 を投げる。 NullPointerException .

言い換えると throw は、その引数が非NULLであることをチェックし、NULLの場合は NullPointerException .

JLS 14.18 指定する という動作があります。

Expression の評価が正常に完了し、NULL 値が生成されると、NULL の代わりにクラス NullPointerException のインスタンス V' が作成され、スローされます。その後、throw文は突然終了し、その理由は値V'を持つthrowである。