源代码复现
public class Main {
public static void main(String[] args) {
String str = null;
System.out.println(str);
System.out.println(str + "");
String test = "test_";
System.out.println(test + str);
Integer integer = null;
System.out.println(integer);
System.out.println(integer + "");
}
}
运行结果
原理分析
着手将“源代码”的class 反编译,得到如下:
import java.io.PrintStream;
public class Main
{
public Main()
{
}
public static void main(String args[])
{
String str = null;
System.out.println(str);
System.out.println((new StringBuilder()).append(str).append("").toString());
String test = "test_";
System.out.println((new StringBuilder()).append(test).append(str).toString());
Integer integer = null;
System.out.println(integer);
System.out.println((new StringBuilder()).append(integer).append("").toString());
}
}
得到如上后逐步分析
- System.out.println
- (new StringBuilder()).append(str)
最终都可以得到使用了 String.valueOf(x)该方法,擦好看该方法后真相大白。
结论
慎用字符串拼接,以免造成不必要bug。