帮助try / catch和访问try中的元素

时间:2011-02-16 17:42:24

标签: java try-catch

try {
    inFile = new Scanner(file);
}
catch (FileNotFoundException e) {
    System.out.println("FileNotFoundException");
}

我有这个代码。但是,在try / catch语句之后,我有以下内容:

while(inFile.hasNext()) {
}

编译器告诉我我没有初始化inFile。我是否需要将所有代码放在try / catch中?我做错了什么?

8 个答案:

答案 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()抛出FileNotFoundExceptioninFile将不会被初始化(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放在不同的循环中以使用户选择另一个文件?或者只是在文件无效时退出程序?该问题的缺失元素是您希望如何处理无效文件。程序是退出还是重新提示用户?