2

我有一个简单的文件读写功能。

private void WriteToFile(String filename, String val) {
    PrintWriter outStream = null;
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(filename);
        outStream = new PrintWriter(new OutputStreamWriter(fos));
        outStream.print(val);
        outStream.close();
    } catch (Exception e) {
        if (outStream != null) {
            outStream.close();
        }
    }
}

private String ReadFile(String filename) {
    String output = "";
    FileReader fr = null;
    BufferedReader br = null;
    try {
        fr = new FileReader(filename);
        br = new BufferedReader(fr);
        output = br.readLine();
        br.close();
    } catch (Exception e) {
        if (br != null) {
            br.close();
        }
    }

    return output;
}

构建时我得到:

unreported exception java.io.IOException; must be caught or declared to be thrown
            br.close();
                    ^

为什么我需要捕获 br.close 但它不会抱怨 WriteToFile 的 close()?

4

4 回答 4

8

取自 java.io.PrintWriter 的源代码:

public void close() {
    try {
        synchronized (lock) {
            if (out == null)
                return;
            out.close();
            out = null;
        }
    }
    catch (IOException x) {
        trouble = true;
    }
}

IOException 在 PrintWriter 的 close() 方法中被吃掉了

来自 java.io.BufferedReader 的源代码:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        in.close();
        in = null;
        cb = null;
    }
}

BufferedReader 抛出 IOException。

那应该回答你的问题。

于 2012-06-08T18:24:38.840 回答
5

为什么我需要捕获 br.close 但它不会抱怨 WriteToFile 的 close()?

您可以查看 Java 文档。BufferedReaderclose()方法:

public void close()
           throws IOException

以及PrintWriterclose()方法:

public void close()

这个答案是关于为什么 JVM 不抱怨的问题。因为从方法签名中很清楚;

于 2012-06-08T18:24:17.780 回答
2

PrinterWriter.close()不会抛出任何异常。如果你打电话fos.close(),它会要求你捕捉/抛出异常。

于 2012-06-08T18:23:23.523 回答
1

在 PrintWriter.java 中。异常被捕获和处理。所以你不需要在使用时抓住它。

Java 源代码:

 public void close() {
        try {
            synchronized (lock) {
                if (out == null)
                    return;
                out.close();
                out = null;
            }
        }
        catch (IOException x) {
            trouble = true;
        }
    }

但是在 BufferedReader 中抛出异常。所以在使用的时候一定要抓住它。

Java 源代码:

  public void close() throws IOException {
            synchronized (lock) {
                if (in == null)
                    return;
                in.close();
                in = null;
                cb = null;
            }
        }
于 2012-06-08T18:28:01.793 回答