12

null次のようなことをしようとすると、コンパイル時のエラーになるため、Java のプリミティブ型は にできないと常に考えていました。

int test = null;

ただし、三項演算では、許可されているようです。

int test = something != 0 ? 5 : null;

(この場合)の略である三項演算ではありません:

int test;
if (something != 0){
    test = 5;
} else {
    test = null
}

もちろん、これは許可されるべきではありません。その条件が失敗した場合、NullPointerExceptionオートボクシングにより自動的に がスローされます。では、なぜ java-compiler はこのようなナンセンスをフェッチしないのでしょうか?

4

1 に答える 1

13

:何が起こるかというと、Java コンパイラーは最初にどちらかの式の型を等しいものにしようとします。この場合、5Integer;に自動ボックス化します。nullは の有効な値であることに注意してくださいInteger。三項式全体の結果は ですInteger。それを に割り当てるとintIntegerは自動的にボックス化解除されます。

基本的に、コンパイラは autoboxing と -unboxing を適用するため、行は次のようになります。

int test = (something != 0 ? Integer.valueOf(5) : null).intValue();

実際、自動ボックス化解除nullNullPointerException.

では、なぜ java-compiler はこのようなナンセンスをフェッチしないのでしょうか?

Java 言語の設計者は、このように機能するように言語を定義し、これをエラーとして扱う必要があるとは判断しなかったためです...

Java 言語仕様のセクション 15.25では、式全体の型を決定する方法について説明しています。

于 2012-11-08T14:46:04.100 に答える