web-dev-qa-db-ja.com

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 IDEA 12は、e instanceof NullPointerExceptionという行が常にfalseであることを示しています。それはまったく真実ではありません。

308
bharal

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

つまり、throwは引数がnullでないことを確認し、nullの場合はNullPointerExceptionをスローします。

JLS 14.18 指定 この動作:

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

411
Louis Wasserman

なぜNullPointerExceptionにアップキャストするのですか?

JLS 14.18

Throwステートメントは、最初に式を評価します。式の評価が何らかの理由で突然終了した場合、スローはその理由で突然終了します。式の評価が正常に完了して非ヌル値Vが生成されると、throwステートメントは突然終了します。その理由は、値Vのスローです。式の評価が正常に完了した場合、生成null値の場合、クラスNullPointerExceptionのインスタンスV 'が作成され、nullの代わりにスローされます。throwステートメントは、値V'のスローであるため、突然完了します。

Javaにnullをスローできるのはなぜですか?

タイプThrowableのオブジェクトをスローできます。nullThrowableの有効な参照であるため、コンパイラーはそれを許可します。

これが ニールガフターが言う

nullはすべての参照型に割り当てることができますが、nullの型自体は参照型ではありません。 throw文の式が参照型であるという要件は、JLSの第3版から削除されるべきであるという意図でしたが、その変更は実際には公開版にはなりませんでした。したがって、これはSE 5で紹介したjavacコンパイラのバグです。

95
NINCOMPOOP

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

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

21
assylias

このように考えると、なぜこれが機能するのかが少しわかりやすくなります。

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);
}
18
Nick Gotch

確かにわからないが、私はその「nullを投げる」と推測している。 not workを実行すると、プログラムが例外をスローし、その例外は(ドラムロール)NullPointerException ...

13
ajb