5

次のコードがNull pointer exceptionをスローする理由を理解したいと思います。

import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> names = null;
        System.out.println("Result is: " + names == null ? null : names.size());
    }
}
4

3 に答える 3

10

問題は、print ステートメントが次のように評価されることです。

System.out.println(("Result is: " + names) == null ? null : names.size());

これは、が演算子+よりも優先?:されるためです。つまり、文字列 - "Result is null"が と等しくないためnull、評価names.size()は NPE をスローします。

nullを文字列連結で使用すると、自動的に に変換されることに注意してください"null"。だから、"Result is: " + null投げませんNPE。これは、JLS - String Conversion によるものです。

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

この問題を解決するには、条件式を括弧で囲んで優先順位を高くする必要があります。

System.out.println("Result is: " + (names == null ? null : names.size()));
于 2013-09-05T05:22:36.900 に答える
4

ジガーの答えを修正すると、これは実際に機能します:

someString + null

OP のコードを修正するには、括弧を追加するだけです。このようにして、操作は正しい順序で実行され、結果は期待どおりになります。

System.out.println("Result is: " + (names == null ? null : names.size()));
于 2013-09-05T05:21:44.720 に答える
2

「結果は次のとおりです:」 + nullと同等ではない名前を書いているため、印刷しようとしていますnames.size()。しかし、names.size()呼び出されると、名前がまだ null であるため、null ポインター例外がスローされます。

変更

System.out.println("Result is: " + names == null ? null : names.size());

System.out.print("Result is: ");
System.out.println( names == null ? null : names.size());

次に、出力として null を取得します。

于 2013-09-05T05:27:22.940 に答える