2014-06-13 97 views
0

我注意到,在下面的代码示例中,当声明“Scanner scan”和“String [] words”时,它们被分配为'null'。我们为什么需要这样做?非常感谢您的帮助! *示例代码旨在从文件中读取字符串,文件的第一行是字符串的数量:int howMany。为什么在使用构造函数时需要分配一个空值? Java

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); 
} 
+2

你不必这样做,它只是一个糟糕的做法,将事情留作“默认”。明确说明通常更清楚。 – Mephy

+0

局部变量未初始化为默认值,这会迫使您为它们提供“已知”值以帮助防止奇怪和不可重复的结果;) – MadProgrammer

+1

在这两种情况下,定义和初始化变量都会更有意义在代码的稍后时间点,例如,何时知道howMany。 – EJP

回答

0

对于第一个问题,为什么初始化扫描仪为空?假设你没有。在你的代码示例中,这没什么关系,但是如果你想在try块之后,在catch或finally块中使用Scanner对象,或者从方法中返回它呢?扫描程序可能没有被初始化,因为你(和编译器)不需要知道try块中会发生什么,直到运行时。没有必要将Scanner实例化为null,它只是将IO对象实例化为try块之外的通用位置,因为通常必须对try块外的IO对象执行某些操作,即关闭它。

其次: “为什么不使用String [] words = new String [];?” 因为数组初始值设定项需要一个介于'['和']'之间的数值,并且该数值是从scan.nextInt()派生的。执行线。为什么它被初始化为空? Se第一段。

在需要限制范围之前不声明对象是一种很好的哲学/策略,作为扩展,直到需要时才能初始化对象。将其中任何一项预先设置为空将导致更多的伤害而不是优点,并将您带到NPE。 Java会默认将数组组件,类变量和实例变量初始化为空。如果这个变量不属于这个类别,那么除非第一段的情况强迫你做别的事情,否则它不会被初始化,因为编译器会警告你它是否在没有首先初始化的情况下使用(这对你来说是一个保护机制,开发者)

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

相关问题