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