纠结混乱尝试抓住Block

时间:2012-11-02 03:23:26

标签: java exception

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-catches。粗略地说,这个纠结的混乱代码块试图展示什么?

3 个答案:

答案 0 :(得分:1)

它尝试查找并打开文件,然后尝试计算该文件中的字符。然后,它尝试关闭文件。

就个人而言,我绝不会在生产中编写这种代码。我会尝试完成所有这些并将其全部放在一个try / catch块中,除非之间有很多处理,例如:

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

当然,如果您在捕获IOException时需要更多特异性,那么您需要单独的块。这是可读性和功能性之间的权衡

答案 1 :(得分: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();

答案 2 :(得分:0)

这证明了什么?

我会选择:破解代码。

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