空字符串连接之谜
在Java中,使用 ' ' 运算符连接字符串是一种常见的操作。但是,当其中一个字符串为空时,会发生意外行为,需要进一步调查。
冲突的期望
传统观点认为,应该连接一个空字符串在 NullPointerException 中。毕竟,null 在 Java 中通常被视为异常值。但是,在这种情况下,结果不是异常,而是包含“null”的字符串。
考虑以下示例:
String s = null; s = s + "hello"; System.out.println(s); // prints "nullhello"
此代码打印“nullhello”而不是抛出NullPointerException,出乎我们的意料。
揭开机制
要理解为什么会发生这种情况,我们必须深入研究 Java 语言规范 (JLS)。根据 JLS,如果字符串连接中的参数之一为 null,则在执行连接之前会自动将其转换为字符串“null”。
实现细节
为了进一步解开这个谜团,我们可以检查编译器为上述代码生成的字节码。编译器实际上将代码转换为相当于以下内容的内容:
String s = null; s = new StringBuilder(String.valueOf(s)).append("hello").toString(); System.out.println(s); // prints "nullhello"
StringBuilder 类优雅地处理 null 值,允许连接成功而无异常。
编译器优化
值得注意的是,JLS 明确允许编译器优化字符串连接以提高性能。在我们的示例中,编译器可以使用更有效的方法,例如直接创建 StringBuffer 并避免中间 String.valueOf() 调用。
含义和用法
此行为对 Java 程序员有几个影响:
以上是为什么Java字符串与Null连接不会抛出NullPointerException?的详细内容。更多信息请关注PHP中文网其他相关文章!