String s = null;
s = s + "hai";
System.out.println(s);
输出:
nullhai
认为这会让我觉得NPE。
背后的基本逻辑是什么?
+
(连接).
答案 0 :(得分:4)
For,s = s + "hai";
在内部,将调用String.valueOf(null)
。该方法会将null
转换为"null"
。
字节代码:
public static void main(java.lang.String[]) throws java.lang.Exception;
0: aconst_null
//some code
10: invokestatic #27; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;// check this line
// some other code
27: return
答案 1 :(得分:3)
不,它不会。编译器将字符串连接替换为StringBuilder
操作,这些操作不会给出空指针异常。编译器完成所有这些后端并节省了编写样板代码的时间。实际上没有这样的事情String
串联为String 不可变
反编译代码: -
String s = null;
s = (new StringBuilder(String.valueOf(s))).append("hai").toString();
System.out.println(s);
那么,你问题的答案。
+
和StringBuilder
操作在内部更改String.valueOf
连接操作。因此,编译器会确保处理空案例</ li>
.
实例上使用String
运算符时,可以调用String
实例中定义的方法,例如String.concat(String str)
,如果String
实例,则会给出NullPointerException是null 答案 2 :(得分:1)
NullPointerException
的引用上调用方法(或尝试访问其中的某个字段;或者您手动抛出null
),则仅抛出{p> NullPointerException
。
在您的情况下不会发生这种情况,因为您的null
引用将转换为"null"
String
,不会在s
本地变量上调用任何方法。< / p>
例如:
String s = null;
boolean isNull = s == null; // This is ok, just testing the value of s
s.toString(); // NPE, s is null
另请注意,即使变量为null
:
s.valueOf(12); // THIS IS ALSO OK, valueOf(int) is static
// It is equivalent to:
String.valueOf(12);