`null`被视为String?

时间:2014-09-08 09:23:42

标签: java string nullpointerexception

String s = null;
s = s + "hai";
System.out.println(s);

输出:

nullhai

认为这会让我觉得NPE。

背后的基本逻辑是什么?
  • 在使用+(连接)
  • 时不投掷NPE
  • 在使用.
  • 时投掷NPE

3 个答案:

答案 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);

那么,你问题的答案。

  1. 编译器使用+StringBuilder操作在内部更改String.valueOf连接操作。因此,编译器会确保处理空案例<​​/ li>
  2. .实例上使用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);