在最近的一个项目中追逐一些NullPointerException
后,我终于找到了他们来自哪里,这让我感到惊讶。虽然我现在可以准确地描述它们来自何处以及如何防止它们,但我仍然对如何在没有编译器或至少IDE的警告的情况下允许发生这种行为感到困惑。
我浏览了Stack并做了一些相当广泛的谷歌搜索,但找不到任何关于此的文章。这里有一些代码可以证明这种奇怪的行为;
public class Test {
String what, why, where = "who knows?";
public static void main(String[] args) {
System.out.println("The 'what' String = " +new Test().what);
}
}
输出;
The 'what' String = null
如果您单独声明并实例化每个String,则显示正确的输出,但将它们链接在一起会导致它们被实例化null
。那么,问题是为什么呢?如果这是标准行为,那么为什么编译器甚至允许我们以这种方式实例化String
个对象?
答案 0 :(得分:3)
因为在内部它归结为:
String what=null;
String why = null;
String where="who knows?"; // declaring 2 strings, only assigning the value to the third one.
答案 1 :(得分:2)
String what, why, where = "who knows?";
仅为where
变量设置值,而其他值设置为默认值null
(当然,如果他们是类成员)。
您可以执行以下操作:(假设您希望所有这些值具有相同的值):
String what, why, where;
what = why = where = "who knows?"
请注意,这两个语句应该在方法,构造函数或(静态)初始化程序中。
答案 2 :(得分:1)
这相当于以下内容,只有where
初始化为给定值"who knows?"
,其他设置为默认值null
String what;
String why;
String where="who knows?";
尝试
String what, why, where;
what = why = where = "who knows?";