try {
inFile = new Scanner(file);
}
catch (FileNotFoundException e) {
System.out.println("FileNotFoundException");
}
我有这个代码。但是,在try / catch语句之后,我有以下内容:
while(inFile.hasNext()) {
}
编译器告诉我我没有初始化inFile。我是否需要将所有代码放在try / catch中?我做错了什么?
答案 0 :(得分:2)
初始化inFile:
Scanner inFile = null;
修改强>
正如其他人所提到的,你应该小心你可能在你的while循环中得到一个NullPointerException。您应该考虑将while循环移动到try块中:
Scanner inFile = null;
...
try {
inFile = new Scanner(file);
while(inFile.hasNext()) {
}
}
catch (FileNotFoundException e) {
System.out.println("FileNotFoundException");
}
答案 1 :(得分:2)
如果您收到编译器错误,则可能需要将inFile
初始化为null。
请注意,稍后在代码中您不应该假设inFile不为null,您应该始终检查它:
e.g。
if (inFile != null) {
while (inFile.hasNext()) {
...
}
}
答案 2 :(得分:2)
编译器抱怨,因为如果new Scanner()
抛出FileNotFoundException
,inFile
将不会被初始化(BTW非常不幸的变量名称)。你的循环应该在try
块内,这也会增加可读性。
try {
Scanner inFile = new Scanner(file);
while(inFile.hasNext()) {
//...
}
inFile.close();
}
catch (FileNotFoundException e) {
System.out.println("FileNotFoundException");
}
答案 3 :(得分:1)
是的,你这样做。如果引发异常,运行时将打印“FileNotFoundException”并继续运行,尽管inFile不会被初始化。
您应该在遇到此异常时让程序返回,或者仅在您确定已正确初始化时才在infile
上执行操作。
答案 4 :(得分:0)
try块与while循环的范围不同。将while循环放在try块中。
答案 5 :(得分:0)
没有你的代码没问题,但必须初始化局部变量,所以你必须设置Scanner inFile = null;
你已经做过的事情是正确的,因为如果你在try / catch语句中移动局部变量,你就无法访问它了。
Scanner inFile = null;
try {
inFile = new Scanner(file);
//more code
} catch (Exception e) {
//exception code
}
while (inFile.nextLine()) {
//loop code
}
如果你有一个实例变量,它会自动设置为null,但在这种情况下你有一个局部变量,然后在你使用之前需要初始化对象。
答案 6 :(得分:0)
警告的原因是您应该首先将扫描仪设置为null。但是你也应该在try块中移动while循环,因为如果抛出异常,你不希望执行while循环(因为inFile将为null)。
答案 7 :(得分:-1)
是的,正如其他人所说,将inFile初始化为null
但是,您还需要检查inFile实际上是否指向了一个有效文件,当您到达循环时它不是NULL e.g。
while(inFile!=null && inFile.hasNext()) {
}
否则,您可能希望将整个try-catch放在不同的循环中以使用户选择另一个文件?或者只是在文件无效时退出程序?该问题的缺失元素是您希望如何处理无效文件。程序是退出还是重新提示用户?