Java中null的字符串化
考虑Java中null的字符串化,java,Java,考虑 public String toString() { return foo + bar; } 其中foo和bar都是类的字段 如果foo和bar中的一个或两个都为null,JLS是否保证为每个字段返回字符串(null),还是保留抛出NPE的权利 如果引用为null,则将其转换为字符串“null”(四个ASCII字符n、u、l、l) 因此,是的,它不会抛出NPE(只要+解析为字符串浓缩,而不是算术运算) 编辑: 事实上,仔细观察,这种行为在技术上并没有定义 字符串转换仅适用于+的非
public String toString()
{
return foo + bar;
}
其中foo
和bar
都是类的字段
如果foo
和bar
中的一个或两个都为null,JLS是否保证为每个字段返回字符串(null)
,还是保留抛出NPE的权利
如果引用为null,则将其转换为字符串“null”(四个ASCII字符n、u、l、l)
因此,是的,它不会抛出NPE(只要+
解析为字符串浓缩,而不是算术运算)
编辑:
事实上,仔细观察,这种行为在技术上并没有定义
字符串转换仅适用于+
的非字符串参数。如果两个参数都是字符串,则不进行转换(因此5.1.11不适用)
然后我们继续,它只指定了以下内容:
…在新创建的字符串中,左操作数的字符先于右操作数的字符
注意:没有对null
s的引用
所以我不认为
(String)null+(String)null的行为是技术定义的…它不会引发任何错误。
如果两个参数都不是字符串,它会尝试将它们转换为字符串。
null的字符串表示形式为“null”
因此,以下是输出:
foo------酒吧----foo+bar
空------空------“空”
空-----“str”---“nullstr”
“str”--null----“strnull”关于复制,它正在向null添加一个显式的非null字符串。所以可能“+”已经处于“字符串连接”模式。我的可以将一个空值添加到另一个空值中。根据另一个问题的答案,尝试将两个空值添加到一起,这是正确的works@P45ImminentJLS(在副本中引用)表示,如果每个操作数为空,@p459(用户名):,则每个操作数都将转换为“空”哼在编辑之后,这会更有趣。我想实用的做法是在表达式前面加上“
null
是null类型,而不是字符串类型-因此应用了字符串转换…@p459它肯定会像您预期的那样工作,这仅仅是规范中的一个漏洞。任何一个半体面的java编译器都能正确地处理这个问题。有人能告诉我为什么我的答案被否决了吗?我尝试了一个样本,这些都是它给出的精确输出。我哪里做错了?你观察到这种行为的事实根本没有解决JLS可能提供的任何保证。哦。谢谢null转换为“null”的事实仅来自JLS。无论如何,谢谢。我会尽量说得具体一些。