为什么在使用构造函数时需要分配空值?JAVA

为什么在使用构造函数时需要分配空值?JAVA,java,arrays,constructor,null,Java,Arrays,Constructor,Null,我注意到在下面的示例代码中,当Scanner scan和String[]单词被声明时,它们被分配为“null”。我们为什么要这样做?非常感谢您的帮助!*示例代码旨在从文件中读取字符串,文件的第一行是字符串数:int howny int howMany; Scanner scan = null; //why do we need to assign a 'null'? File f; String[] words = null; //why not use String[] words= n

我注意到在下面的示例代码中,当Scanner scan和String[]单词被声明时,它们被分配为“null”。我们为什么要这样做?非常感谢您的帮助!*示例代码旨在从文件中读取字符串,文件的第一行是字符串数:int howny

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

对于第一个问题,为什么要将扫描器初始化为null?假设你没有。在您的代码示例中,这无关紧要,但是如果您想在try块之后、catch块或finally块中使用Scanner对象,或者从方法返回它,该怎么办?扫描程序可能尚未初始化,因为在运行时之前,您和编译器不一定知道try块中会发生什么。没有必要将扫描器实例化为null,只是在try块之外将IO对象实例化为null是很常见的,因为您通常必须在try块之外处理该IO对象,即关闭它。 第二: 为什么不使用字符串[]单词=新字符串[]? 因为数组初始值设定项需要介于“[”和“]”之间的金额,并且该金额来自scan.nextInt;执行线。为什么要将其初始化为null?请看第一段。 在需要限制范围之前不声明对象是一种很好的理念/策略,作为一种扩展,在需要之前不初始化对象是很好的。先发制人地将其中任何一个设置为null都会造成弊大于利,并且会让你面临NPE。默认情况下,Java将数组组件、类变量和实例变量初始化为null。如果变量不属于这一类,则将其保持未初始化状态,除非第一段的情况迫使您执行其他操作,因为编译器会警告您,如果在未初始化的情况下使用它,这是一种保护机制
因此,要回答您的问题,在给定的示例中,您不需要这样做,而且可能不应该这样做。

您不必这样做,将事物保留为默认状态是一种不好的做法。使其显式通常更为明确。局部变量未初始化为默认值,这迫使您向它们提供已知值,以帮助防止出现奇怪和不可重复的结果;在这两种情况下,在以后的代码中定义和初始化变量会更有意义,例如,当“多少”已知时。