为什么我们可以一次实例化多个变量?

时间:2014-03-31 09:36:12

标签: java string null instantiation

在最近的一个项目中追逐一些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个对象?

3 个答案:

答案 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?";