2011-02-16 48 views
1
try { 
    inFile = new Scanner(file); 
} 
catch (FileNotFoundException e) { 
    System.out.println("FileNotFoundException"); 
} 

我有这段代码。但是,在try/catch语句后,我有以下几点:帮助try/catch和访问try内的元素

while(inFile.hasNext()) { 
} 

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

+0

那么,如果发生异常会发生什么?将`inFile`分配任何东西(可用)? – delnan 2011-02-16 17:50:32

回答

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

并且得到一个'NullPointerException' – 2011-02-16 17:58:21

+0

这已经足够了,但是应该在catch语句中处理它,因为Exception是inFile应该为null的唯一方法。或者,可以像Tomasz Nurkiewicz所建议的那样将while语句移入try块。我们对适用于OP整体计划的地方的背景有限。 – proflux 2011-02-16 18:56:31

0

try块与while循环不在同一个范围内。将while循环放入try块中。

+0

它在尝试中被初始化,据推测在其外部定义。 – proflux 2011-02-16 17:45:43

+0

没关系。它可以被宣布为任意数量的地方。初始化是重要的,移动try块内的while循环将它放在与初始化相同的范围内。这使得try块之外的声明成为不必要的,但这是一个简单的重构。 – 2011-02-16 17:47:50

+0

对不起,我误解了你的答案。我的错。 – proflux 2011-02-16 19:02:47

0

没有你的代码是好的,但局部变量必须intialized所以你必须设置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 
} 

如果你有一个实例变量,它会被自动设置为空,但在这种情况下,你有一个局部变量,然后需要在使用前进行初始化的对象。

+1

循环应该在try中,因为如果抛出异常,它不应该执行。或者至少应该在这段时间之前检查null。 – DaveJohnston 2011-02-16 17:48:32

2

如果你得到一个编译器错误,你可能需要初始化​​为空。

注意,后面的代码,你不应该假设INFILE不为空,您应经常检查它:

例如

if (inFile != null) { 
    while (inFile.hasNext()) { 
     ... 
    } 
} 
0

警告的原因是您应该将扫描仪初始设置为空。但是你也应该在try块内部移动while循环,因为如果抛出异常,你不希望执行while循环(因为inFile将为null)。

2

编译器正在抱怨,因为如果new Scanner()引发FileNotFoundException,​​将不会被初始化(BTW非常不幸的变量名称)。你的循环应该在try块内,这也会增加可读性。

try { 
    Scanner inFile = new Scanner(file); 
    while(inFile.hasNext()) { 
     //... 
    } 
    inFile.close(); 
} 
catch (FileNotFoundException e) { 
    System.out.println("FileNotFoundException"); 
} 
1

是的,你这样做。如果发生异常,运行时将打印“FileNotFoundException”并将继续运行,尽管inFile不会被初始化。

您应该在遇到此异常时使程序返回,否则只有在确定它已正确初始化后才在infile上执行操作。

-1

是的,正如其他人所说,初始化INFILE为null

但是,你还需要检查INFILE实际指向一个有效的文件,当你得到你的循环 例如不为NULL

while(inFile!=null && inFile.hasNext()) { 
} 

否则,您可能希望将整个try-catch置于不同的循环中以使用户选择另一个文件?或者如果文件无效则退出程序?问题的缺失是您希望如何处理无效文件。程序是否退出或重新提示用户?