有人能告诉我在下面的java代码中我做错了什么吗?它不编译并给我编译错误。
import java.io.*;
public class ShowFile {
public static void main(String[] args) {
int i;
FileInputStream Fin;
try {
Fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
} catch (FileNotFoundException exp) {
System.out.println("exception caught" + exp);
}
try {
do {
i = Fin.read();
System.out.print((char) i);
} while (i != -1);
} catch (IOException exp) {
System.out.println("Exception caught" + exp);
}
finally {
try {
Fin.close();
} catch (IOException exp) {
System.out.println("Exception caught" + exp);
}
}
}
}
而下面的代码编译。您可以看到两个初始化都在try块中。
import java.io.*;
class ShowFile2 {
public static void main(String args[]) {
int i;
FileInputStream fin;
// First make sure that a file has been specified.
try {
fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
} catch (FileNotFoundException exc) {
System.out.println("File Not Found");
return;
}
try {
// read bytes until EOF is encountered
do {
i = fin.read();
if (i != -1) {
System.out.print((char) i);
}
} while (i != -1);
} catch (IOException exc) {
System.out.println("Error reading file.");
}
try {
fin.close();
} catch (IOException exc) {
System.out.println("Error closing file.");
}
}
}
答案 0 :(得分:2)
问题是,如果new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
抛出异常,则不会在方法的第二部分初始化变量。这是不允许的。创建对象时,对象成员将初始化为null
,但局部变量不是这种情况:必须明确初始化它们。
快速修复(但请继续阅读以获得更好的修复)是在定义变量时将其初始化为null
:
FileInputStream fin = null;
这将解决您的编译错误,但是,当第一个catch块中抛出异常时,您将获得NullPointerException
。
更好的解决方案是将错误处理逻辑放在同一位置:如果创建FileInputStream
失败,则无论如何都不想从中读取字节。所以你可以使用一个try-catch块:
try {
fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
// Read bytes from fin.
...
} catch (IOException e) {
// handle exception
...
}
最终建议:为确保您的输入流在所有情况下都已关闭,您可以使用try-with-resources块:
try (fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt")) {
// Read bytes from fin.
...
} catch (IOException e) {
// handle exception
...
}
答案 1 :(得分:1)
它确实编译,因为ShowFile2
类在catch块中包含return
:这将确保变量fin
将始终初始化。
在第一堂课中,你遇到了异常并继续执行你的程序。