49
public class Test {
    public static void main(String[] args) {

        String s = null;
        String s1 = null;
        Integer i = null;
        Integer i1 = null;

        System.out.println(s+i);
        System.out.println(i+s);
        System.out.println(s+s1);

        try {
            System.out.println(i+i1);
        } catch (NullPointerException np) {         
            System.out.print("NullPointerException");       
        }
    }

}

質問は簡単です-なぜ私NullPointerExceptionは最後の行だけを受け取るのですか?

4

6 に答える 6

60

あなたのコードは2つの異なる加法演算子を利用しています。最初の3行は文字列の連結を使用していますが、最後の行は数値の加算を使用しています。

文字列の連結は、次のように明確に定義されていnullます"null"

  • 参照が、の場合、文字列(4つのASCII文字、、、、)にnull変換されます。"null"null

したがって、NPEはありません。

Integer2つのオブジェクトを一緒に追加するには、それらをボックスから外す必要があります。これにより、null参照が逆参照され、NPEが発生します。

  • がnullの場合r、開梱変換はNullPointerException
于 2013-01-26T16:32:31.767 に答える
17

+最初の3つの演算子の使用には、文字列の連結が含まれることに注意してください。最後のものだけが実際の数値の合計です。文字列の連結が含まれる場合(s変数が含まれる場合)、Javaコンパイラはパフォーマンスを向上させるためにいくつかの巧妙なトリックを使用します。+演算子を。に置き換えStringBuilderます。たとえば、最初の行は次のように翻訳されます。

StringBuilder tmp = new StringBuilder();
tmp.append(s);
tmp.append(i);
System.out.println(tmp);

StringBuildernullフレンドリーなので、引数として何を渡しても、"null"文字列にうまく置き換えられます。

最後の行では状況が異なります。Integerそこで、2つのオブジェクトを参照します。ここでJVMが実行できるのは、それらのボックスを解除して(i.intValue())、実際の計算を実行することだけです。null原因の開梱NullPointerException

于 2013-01-26T16:27:53.963 に答える
5

何かを a に連結 (+演算子)すると、String結果はString. すべてのオペランドは最初に String に変換され ( を使用するかtoString()、 value を使用して"null")、次に連結されます。

ただし、最後の操作にはIntegers のみが含まれるため、前の規則は適用されません。連結の代わりに、加算を行います。ただし、2 つの を追加するにIntegerは、オブジェクト ( ) をプリミティブ値 (int) に変換します。これは、が nullIntegerの場合は不可能です。Integerそれがあなたが得る理由ですNullPointerException

于 2013-01-26T16:29:23.747 に答える
1

自動開梱の場合のようです。とが2つある場合Integer、それらを加算した結果はになります。どちらもnullであるため、NPEになります。firstsecondfirst.intValue() + second.intValue()

于 2013-01-26T16:28:07.783 に答える
0

プログラムのバイトコードを見てください。nullオブジェクトがパラメータとしてPrintStream.print()メソッドに渡されていることに気付くでしょう。print()メソッドのソースコードは、以下に示すようにString.valueOf()を使用します。

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
于 2013-01-26T16:41:20.803 に答える
0

この質問に対する答えは、出力から明らかであるはずであることに注意してください。

C:\Temp>java Test
nullnull
nullnull
nullnull
NullPointerException
于 2013-02-01T17:51:26.033 に答える