Java BufferedReader can';如果不输入catch-22,则不能声明打开文件

Java BufferedReader can';如果不输入catch-22,则不能声明打开文件,java,bufferedreader,Java,Bufferedreader,我试图声明一个BufferedReader,以便从.txt文件中读取信息。本人声明如下: BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input-file.txt")))); 现在,我有一个小问题,因为Java抱怨如果我没有在try/catch块中声明它-毕竟,不能保证系统会找到输入文件,所以我需要捕获抛出的任何IOException。但如果我将该声明放在t

我试图声明一个BufferedReader,以便从.txt文件中读取信息。本人声明如下:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input-file.txt"))));

现在,我有一个小问题,因为Java抱怨如果我没有在try/catch块中声明它-毕竟,不能保证系统会找到输入文件,所以我需要捕获抛出的任何IOException。但如果我将该声明放在try-catch块中,Java也会抱怨;稍后我将使用.readLine()方法引用br,由于br是在try/catch块中声明的,因此不能保证将创建BufferedReader。但是,如果我尝试将BufferedReader从try/catch块中取出以确保它已创建,那么我无法捕获IOException…如何摆脱此陷阱?

您可以从try-catch块中的BufferedReader读取:

try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input-file.txt"))))) {
    String s = br.readLine();
} catch (IOException io) {}

当您使用I/O资源
java编译器
时,它会强制您处理可能发生的意外错误。这在Java中称为
checked exception
,无法避免。因此,如果您想读取文件,可以按以下步骤执行:

new FileReader("input-file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) { ... }
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) {
    // your logic

} catch (FileNotFoundException e) {
    e.printStackTrace();

} catch (IOException e) {
    e.printStackTrace();
}
若并没有这样的文件,它会抛出
FileNotFoundException
,这是
选中的异常
,编译器会强制您在编译时处理它。您可以在
BufferedReader
中装饰它:

BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"));
BufferedReader
实现了
AutoCloseable
接口,您可以在
try
in
try with resources
语句中声明它,如下所示:

new FileReader("input-file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) { ... }
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) {
    // your logic

} catch (FileNotFoundException e) {
    e.printStackTrace();

} catch (IOException e) {
    e.printStackTrace();
}
编译器将强制您处理
FileNotFoundException
IOException
。当
try
块完成其执行时,它会自动调用
close
方法,该方法可能会抛出此
IOException
,因此您也应该处理它。因此,完整的版本可能如下所示:

new FileReader("input-file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) { ... }
try (BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"))) {
    // your logic

} catch (FileNotFoundException e) {
    e.printStackTrace();

} catch (IOException e) {
    e.printStackTrace();
}

他在问题中说,他已经在try-catch Block中尝试过了,他试图只声明BufferedReader实例,而不是使用它,我不理解你所说的catch-22;我以前创建过流的阅读器,没有问题。你能发布你认为会产生第22条军规的确切代码吗,或者尽可能接近它?否则我们只能猜测你的实际问题是什么。同意@yshavit。。。没有看到代码,就不清楚确切的问题是什么。另外,不要说“Java抱怨”。Java不会抱怨;它为您提供了有关错误的具体信息,您需要与我们共享这些信息。