1
public int countChars3(String fileName) {
        int total = 0;
        FileReader r = null;
        try {
            r = new FileReader(fileName);
        } catch (FileNotFoundException e) {
            System.out.println("File named " + fileName + " not found. " + e);
            total = -1;
        }
        try {
            while (r.ready()) {
                try {
                    r.read();
                } catch (IOException e) {
                    System.out.println("IOException" + "occurred while counting " + "chars. " + e);
                    total = -1;
                }
                total++;
            }
        } catch (IOException e) {
            System.out.println("IOExceptionoccurred while counting chars. " + e);
            total = -1;
        }
        try {
            r.close();
        } catch (IOException e) {
            System.out.println("IOExceptionoccurred while counting chars. " + e);
            total = -1;
        }
        return total;
    }

上面的代码是一个纠结的 try-catch 块的例子。通过阅读代码,它们看起来确实很乱,有几个嵌套的 try-catch。概括地说,这个纠结的代码块试图展示什么?

4

3 回答 3

1

它尝试定位并打开一个文件,然后尝试计算该文件中的字符数。然后,它会尝试关闭该文件。

就个人而言,我永远不会在生产环境中编写这种代码。我会尝试完成所有这些并将它们全部放在一个 try/catch 块中,除非在两者之间进行大量处理,如下所示:

try {
    r = new FileReader(fileName);
    while(r.ready()) {
        r.read();
        total++;
    }
    r.close();
}
catch(IOException ioe) {
    //handle
}

当然,如果您在捕获 IOException 时想要更具体地了解发生了什么,那么您需要单独的块。这是可读性和功能之间的权衡

于 2012-11-02T03:25:52.040 回答
1

只需让方法抛出它并让客户端处理它,你也应该有一个 finally{} 来关闭资源。

public int countChars3(String fileName) throws IOException {
    int total = 0;
    FileReader reader = new FileReader(fileName);
    try {
        while (reader.ready()) {
            reader.read();
            total++;
        }
        reader.close();
    } finally {
        reader.close();
    }
    return total;
}

你的意思是计算字符还是字节,如果字节你的整个代码可以替换为:

return (int) new File(fileName).length();
于 2012-11-02T03:34:43.543 回答
0

这说明了什么?

我将使用:损坏的代码。

将所有这些组合成一个 try-catch 不仅更具可读性,而且更正确。主要问题是早期捕获不可恢复的异常(例如 FileNotFound)它仍然会继续执行其余代码(这里它将抛出未处理的 NPE)。

于 2012-11-02T03:30:44.040 回答