String s = null;
s = s + "hai";
System.out.println(s);
输出:
nullhai
我本以为这会让我遇到NPE异常。
那么,为什么在使用+
(拼接)时不会抛出NPE异常,而在使用.
时会抛出NPE异常呢?
String s = null;
s = s + "hai";
System.out.println(s);
输出:
nullhai
我本以为这会让我遇到NPE异常。
那么,为什么在使用+
(拼接)时不会抛出NPE异常,而在使用.
时会抛出NPE异常呢?
针对代码中的 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
String s = null;
s = (new StringBuilder(String.valueOf(s))).append("hai").toString();
System.out.println(s);
因此,对于你的问题的答案。
StringBuilder
和String.valueOf
操作来改变+
连接操作。因此,编译器确保处理了null情况String
实例上使用.
运算符时,您将调用在String
实例中定义的方法,例如String.concat(String str)
,如果您的String
实例为null,则会出现NullPointerExceptionString.valueOf()
被内部调用。如果没有valueOf(),你将会得到一个NPE。 :) - TheLostMindNullPointerException
只会在您尝试在引用为null
时调用方法(或尝试访问其字段;或手动抛出NullPointerException
)时抛出。
在您的情况下,这种情况不会发生,因为您的null
引用将被转换为"null"
String
,不会在s
本地变量上调用任何方法。
例如:
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);
s.XXX
等同于String.XX
吗? - Vinay Veluri