在以下程序中,如果我从:
中删除return语句catch(FileNotFoundException e) {
System.out.println("File Not Found");
return;
它在do while循环中显示一个错误,即局部变量fin
可能尚未初始化。有人能解释我为什么会这样吗?
import java.io.*;
class Stock {
public static void main(String args[])
throws IOException {
int i;
FileInputStream fin;
try {
fin = new FileInputStream(args[0]);
} catch(FileNotFoundException e) {
System.out.println("File Not Found");
return;
}
// read characters until EOF is encountered
do {
i = fin.read();
if(i != -1) System.out.print((char) i);
} while(i != -1);
fin.close();
}
}
答案 0 :(得分:3)
如果删除return
语句,则会获得:
public static void main(String args[])
throws IOException {
int i;
FileInputStream fin;
try {
fin = new FileInputStream(args[0]);
} catch(FileNotFoundException e) {
System.out.println("File Not Found");
}
// read characters until EOF is encountered
do {
i = fin.read();
if(i != -1) System.out.print((char) i);
} while(i != -1);
fin.close();
}
现在,如果FileInputStream
抛出异常,则不会返回结果,并且fin
不会被初始化。 catch
块处理异常并打印消息,但随后代码继续,它尝试执行的下一个操作是i = fin.read()
。由于编译器发现在没有初始化fin
或为其分配任何内容的情况下有可能获得此语句,因此它不会编译该程序。
如果您重新插入return
,则不会发生这种情况,因为catch
阻止会导致main
返回,而您无法访问fin.read()
}。
答案 1 :(得分:1)
可能在try块中的调用中抛出异常,因此不会为变量fin
分配任何值。如果没有return语句,后续使用未初始化的fin
变量会导致编译器抱怨。
使用return语句,如果fin
变量从未被初始化,它也永远不会被使用,所以编译器就可以了。
答案 2 :(得分:1)
为什么编译器抱怨
- if your main() encounter the exceptions it will pass try catch block and never get the
chance to initialize fin variable
- Compiler knows that program may end up with throwing an exception which has high chance
in order to avoid any fruther issue it will not complie
我建议你这样做
- use try catch block with resources since Java 7 since Class `FileInputStream` is `closable`
- put everything in a good order
代码:
try(FileInputStream fin =new FileInputStream(args[0]) ) {
while ((content = fin.read()) != -1) {
// convert to char and display it
System.out.print((char) content);
}
} catch(FileNotFoundException e) {
System.out.println("File Not Found");
return;
} ...
....
..
来源:
http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html
答案 3 :(得分:0)
new FileInputStream(args[0]);
可能会发生异常,这会导致fin未初始化。
尝试使用fin的默认值:
fin = null;
然后,检查以确保它不为空:
if (fin != null)
{
do {
i = fin.read();
if(i != -1) System.out.print((char) i);
} while(i != -1);
fin.close();
}
答案 4 :(得分:0)
如果在实例化FileInputStream时遇到异常,则在将值存储在变量fin中之前,控制将移动到catch块。如果没有return语句,程序将继续执行do / while循环,其中将在未初始化的变量上调用方法(读取),从而导致错误。