Der*_*har 21 java exception-handling exception
您是否同意Java类的设计者java.io.IOException应该使其成为一个未经检查的运行时异常,java.lang.RuntimeException而不是仅从派生的派生异常派生java.lang.Exception?
我认为该类IOException应该是一个未经检查的异常,因为应用程序几乎无法解决文件系统错误等问题.然而,当你不能抛出异常,埃利奥特·鲁斯蒂·阿罗德声称,大多数I/O错误是短暂的,所以你可以放弃之前重试I/O操作几次:
例如,IOComparator可能不会出现I/O错误,但是 - 因为许多I/O问题是暂时的 - 您可以重试几次,如清单7所示:
通常情况如此吗?Java应用程序可以纠正I/O错误还是等待系统恢复?如果是这样,那么检查IOException是合理的,但如果不是这样,则应取消选中IOException,以便业务逻辑可以将此异常的处理委托给单独的系统错误处理程序.
M. *_*sup 18
我完全不同意.对我来说,模型是正确的.RuntimeException是最常表示编程逻辑中的严重错误(例如ArrayIndexOutOfBounds,NullPointer或IllegalArgument)或运行时确定不应发生的事情(例如SecurityException).
相反地IOException异常及其衍生物是可能的程序的正常执行,共同逻辑期间发生合理将决定,要么这些问题应处理,或至少程序员应该意识到,他们可以发生的异常.例如,如果您的应用程序记录器无法写入其数据,那么您宁愿被迫捕获潜在的IOException并进行恢复,或者对您的应用程序可能不重要的事情会导致整个JVM崩溃,因为没有人想要抓住它未检查的异常(正如您可能已经猜到的那样,我将选择前者).
我认为在很多情况下IOException是可恢复的,或者至少程序员应该明确地意识到这种可能性,这样如果它不可恢复,系统可能会更"轻柔"地崩溃.
到目前为止,您对系统无法恢复的想法总是存在检查异常的替代方案.你总是可以让你的方法在它们的throws中声明它,抛出它们自己的运行时异常或猛烈地崩溃JVM:
public void doit() throws IOException {
try{
}catch(IOException e){
// try to recover
...
// can't recover
throw e;
}
}
public void doit() {
try{
}catch(IOException e){
// try to recover
...
// can't recover
throw new RuntimeException(e);
}
}
public void doit() {
try{
}catch(IOException e){
// try to recover
...
// OH NO!!!!
System.exit(Constant.UNRECOVERABLE_IO_ERROR);
}
}
Run Code Online (Sandbox Code Playgroud)
nhy*_*ted 17
我知道问题已经过去了4年,但Java 8中添加了一个UncheckedIOException.
我认为将它作为一个经过检查的例外很聪明.我认为运行时异常是错误,显然不是这种情况.有时可以通过重试进行恢复,并且一些IOException消息可以为最终用户提供信息(例如,没有写入权限,没有足够的磁盘空间等).