【问题标题】:BufferedReader can't be declared opening a file without entering a catch-22不输入 catch-22 就不能声明 BufferedReader 打开文件
【发布时间】:2018-05-16 05:10:55
【问题描述】:

我正在尝试声明一个 BufferedReader 以便从 .txt 文件中读取信息。我通过以下方式声明它:

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

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

【问题讨论】:

  • 我不明白你说的catch-22;我之前没有问题地创建了流的读者。您能否发布您认为会创建 catch-22 或尽可能接近它的确切代码?否则,我们只能猜测您的实际问题是什么。
  • 同意@yshavit...没有看到代码,不清楚确切的问题是什么。另外,不要说“Java 抱怨”。 Java 没有抱怨;它为您提供了有关错误的具体信息,您需要与我们分享。

标签: java bufferedreader


【解决方案1】:

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

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

【讨论】:

  • 他在他的问题中说他已经在 try-catch 块中尝试过了
  • 他试图只声明 BufferedReader 实例,而不是使用它
【解决方案2】:

当您使用 I/O 资源时,java compiler 会强制您处理可能事先发生的意外错误。这在 Java 中称为checked exception,没有办法避免它。所以,如果你想读取一个文件,你可以这样做:

new FileReader("input-file.txt");

如果没有这样的文件,它会抛出FileNotFoundException,这是checked exception,编译器会强制你在编译时处理它。你可以在BufferedReader内装饰它:

BufferedReader reader = new BufferedReader(new FileReader("input-file.txt"));

BufferedReader 实现了AutoCloseable 接口,您可以在try-with-resources 语句中的try 中声明它,如下所示:

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

编译器会强制你处理FileNotFoundExceptionIOException。当try 块完成执行时,它会自动调用close 方法,该方法可能会抛出这个IOException,所以这也是你应该处理它的原因。因此,完整的版本可能如下所示:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多