gpt4 book ai didi

java - 使用 FileInputStream 编译错误说变量未初始化

转载 作者:行者123 更新时间:2023-12-01 18:08:58 24 4
gpt4 key购买 nike

有人可以告诉我在下面的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 block 内。

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

最佳答案

问题是,如果 new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");抛出异常,您的变量将不会在方法的第二部分中初始化。这是不允许的。对象成员将被初始化为 null当对象被创建时,但局部变量的情况并非如此:它们必须显式初始化。

一个快速修复(但请继续阅读以获取更好的修复)是在定义变量时初始化变量(为 null ):

FileInputStream fin = null;

这将解决您的编译错误,但是,您将得到 NullPointerException当第一个 catch block 中抛出异常时。

更好的解决方案是将错误处理逻辑放在同一位置:如果创建 FileInputStream失败,无论如何你都不想从中读取字节。因此您可以使用单个 try-catch block :

try {
fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
// Read bytes from fin.
...
} catch (IOException e) {
// handle exception
...
}

最终建议:为了确保您的输入流在所有情况下都关闭,您可以使用 try-with-resources block :

try (fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt")) {
// Read bytes from fin.
...
} catch (IOException e) {
// handle exception
...
}

关于java - 使用 FileInputStream 编译错误说变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com