2014-03-31 92 views
0

在最近的一个项目中追查了一些NullPointerException后,我终于找到他们来自哪里,这让我感到惊讶。尽管我现在可以准确地描述它们来自哪里以及如何防止它们,但我仍然对这种行为如何在没有来自编译器或至少IDE的警告的情况下允许发生混淆。为什么我们可以一次实例化多个变量?

我浏览了一下Stack并做了一些相当广泛的使用Google,但是找不到任何关于此的文章。为了切入这个追逐,一些代码证明了这种奇怪的行为;

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 

这说明正确的输出,如果你申报并单独实例每个字符串,而是链接在一起这样使它们被实例化null。那么,问题是为什么?如果这是标准行为,那么为什么编译器甚至允许我们以这种方式实例化String对象?

+1

'String what,why,where =“谁知道?” ;' 这是similer到 'String什么; 为什么; String where =“谁知道?”;' –

+0

警告你什么?你声明了三个变量并初始化一个变量。并不罕见。 –

回答

3

因为内部也下降到:

String what=null; 
String why = null; 
String where="who knows?"; // declaring 2 strings, only assigning the value to the third one. 
+1

谢谢。过去一年多来,我一直在进行过度广泛的编程,而且我从来不知道你只是列举了最后一个。就在你认为你的基础知识百分百降低时,就会发生类似的情况。每天学些新东西。 –

+0

我们都在继续学习:) – TheLostMind

2

String what, why, where = "who knows?";集值只对所述where变量,而其他被设置为其默认之一,它是null(如果它们是类成员,当然)。

你可以做到以下几点:(假设你希望他们都具有相同的值):

String what, why, where; 
what = why = where = "who knows?" 

注意,这两个语句应该是一个方法,构造或(静态)初始化内。

1

这equalant到下面,只where得到初始化为给定值"who knows?",其他设置为默认值null

String what; 
String why; 
String where="who knows?"; 

尝试

String what, why, where; 
what = why = where = "who knows?"; 
相关问题