使用Constructor时为什么需要指定空值? Java的

时间:2014-06-13 02:55:10

标签: java arrays constructor null

我注意到在下面的示例代码中,当"扫描仪扫描"和"字符串[]字"宣布后,他们被分配为“无效”。为什么我们需要这样做?非常感谢您的帮助! *示例代码用于从文件中读取字符串,文件的第一行是字符串数:int howMany。

int howMany;
Scanner scan = null;  //why do we need to assign a 'null'?  
File f;
String[] words = null; //why not use String[] words= new String []; ?

try {
   f = new File(filename);
   scan= new Scanner(f); 
   howMany = scan.nextInt(); 
   words = new String[howMany];

   for (int i = 0; i < howMany; i++) {
     words[i] = scan.next();
   }
} catch (IOException e) {
   System.out.println(e); 
}

1 个答案:

答案 0 :(得分:0)

对于第一个问题,为什么要将Scanner初始化为null?假设你没有。在你的代码示例中,这并不重要,但如果你想在try块之后,catch或finally块中使用Scanner对象,或者从方法返回它,该怎么办?扫描程序可能尚未初始化,因为您(和编译器)不一定知道在运行时try块中会发生什么。将扫描器实例化为null并不是必需的,在try块之外将IO对象实例化为null是常见的,因为您通常必须对try块之外的IO对象执行某些操作,即关闭它。登记/>
其次:     “为什么不使用String [] words = new String [];?” 因为数组初始值设定项需要'['和']'之间的数量,并且数量来自scan.nextInt();执行线。为什么它被初始化为null?见第一段。

在需要限制范围之前不要声明对象是一个很好的哲学/策略,作为扩展,最好不要在需要之前初始化对象。将这些中的任何一个设置为先发制人将导致更多的弊大于利,并打开你的NPE。默认情况下,Java会将数组组件,类变量和实例变量初始化为null。如果变量不属于这个类别,那么将它保持为未初始化,除非第一段情况强迫你这样做,因为编译器会警告你是否在没有首次初始化的情况下使用它(这对你来说是一个保护机制,开发人员)

所以要回答你的问题,你不需要在给定的例子中这样做,也可能不应该这样做。