316

これを実行するとき:

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 になることを教えてくれます。これはまったく真実ではありません。

4

7 に答える 7

425

nullとして扱われるのではなく、それ自体NullPointerExceptionを試みる行為が をスローするようです。 throw null NullPointerException

つまり、throw引数が null でないことを確認し、null の場合はNullPointerException.

JLS 14.18では、次の動作が指定されています。

Expression の評価が正常に完了し、null 値が生成された場合、クラス NullPointerException のインスタンス V' が作成され、null の代わりにスローされます。その後、throw ステートメントは突然完了します。その理由は、値 V' のスローです。

于 2013-07-10T17:18:12.517 に答える
21

JLSに準拠して動作します。

Expression の評価が正常に完了し、null 値が生成された場合、クラス NullPointerException のインスタンス V' が作成され、null の代わりにスローされます。

于 2013-07-10T17:22:56.263 に答える
13

よくわかりませんが、「nullを投げる」と推測しています。動作せ、それを試みるとプログラムが例外をスローし、その例外がたまたま (ドラムロール) NullPointerException...

于 2013-07-10T17:18:30.733 に答える