当前位置: 首页 > 面试题库 >

Java中的IOException类是否应为未经检查的RuntimeException?

松雅昶
2023-03-14
问题内容

您是否同意Java类的设计者java.io.IOException应该使它成为从派生的未经检查的运行时异常,java.lang.RuntimeException而不是仅从派生的未检查的运行时异常java.lang.Exception

我认为该类IOException应该是未经检查的异常,因为应用程序几乎无法解决文件系统错误之类的问题。但是,在《无法抛出异常》中,Elliotte
Rusty
Harold

声称大多数I
/ O错误都是暂时的,因此您可以在放弃之前多次重试一次I / O操作:

例如,一个IOComparator可能不会遇到I / O错误,但是由于许多I / O问题是暂时的,因此您可以重试几次,如清单7所示:

通常是这样吗?Java应用程序可以纠正I /
O错误或等待系统恢复吗?如果是这样,则检查IOException是合理的,但是如果不是,则应取消IOException,以便业务逻辑可以将此异常的处理委托给单独的系统错误处理程序。


问题答案:

我完全不同意。对我来说,模型是正确的。RuntimeException是最通常表示编程逻辑中的严重错误(例如ArrayIndexOutOfBounds,NullPointer或IllegalArgument)或运行时确实确定不应发生的错误(例如SecurityException)。

相反,IOException及其派生类是在程序正常执行期间可能合理地发生的异常,并且通用逻辑将指示应解决这些问题,或者至少程序员应意识到它们可能会发生。例如,对于“文件”,如果您的应用程序记录器无法写入其数据,则您宁愿被迫捕获潜在的IOException并进行恢复,还是选择对应用程序不重要的操作来关闭整个JVM,因为没有人想到捕获该JVM。未经检查的异常(您可能已经猜到了,我将选择前者)。

我认为,在许多情况下,IOException是可恢复的,或者至少程序员应明确意识到潜在的危险,这样,如果无法恢复,则系统可能会更加“崩溃”。

就您所能想到的,如果系统无法恢复,则总是存在带有已检查异常的替代方案。您总是可以让自己的方法在抛出它们时声明它,抛出它们自己的运行时异常,或者猛烈地使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);
  }
}


 类似资料:
  • 问题内容: 我想处理(未经检查的)异常错误。我听说对于每种异常,我都应该创建Error或RuntimeException的子类。有什么不同? 问题答案: 应该确定程序上无法恢复的问题(例如内存不足)。应该确定由程序无法控制的意外情况(例如,数据库关闭)引起的可程序恢复的问题。应该识别由代码流中的错误引起的可程序恢复的问题(阅读:开发人员的错误,例如空指针,非法参数等)。 就您而言,您想继承。

  • 问题内容: 有没有一种简单的方法来验证对象属于给定的类?例如,我可以 但这需要每次在运行中实例化一个新对象,而只是将其丢弃。有没有更好的方法来检查“ a”是否属于类“ MyClass”? 问题答案: 如其他答案所述,关键字通常是您想要的。请记住,超类也会返回。 如果要查看对象是否是类的直接实例,则可以比较该类。您可以通过获取实例的类对象。您可以通过静态访问特定的类。 因此,例如: 在上面的例子中,

  • 问题内容: 是否有任何方法或快速方法来检查Java中数字是否为整数(属于Z字段)? 我考虑过从四舍五入的数字中减去它,但是我没有找到任何可以帮助我解决这个问题的方法。 我应该在哪里检查?整数Api? 问题答案: 又快又脏… 编辑:假设x已经是其他数字形式。如果要处理字符串,请查看。

  • 问题内容: 我有以下代码行 哪里 但我收到有关未经检查的转化的警告。如何停止此警告? 问题答案: 之所以会这样,是因为getSpecialCharMap()返回的对象的类型不能由编译器验证为HashMap 。继续并提供getSpecialCharMap的原型。

  • 问题内容: 所以我知道这是一个很普遍的问题,已经找到了解决方案。但是,当我尝试这样做时,它无法正常工作。 我的JTextField为空,并且未启用该按钮。当我在文本字段中写入内容时,该按钮未启用。 因此,我的程序应每秒检查一次此字段是否为空。只要有人在文本字段中写入内容,就应启用该按钮。^^ 问题答案: 为此,您需要在中添加更改侦听器(一个响应文本更改的侦听器),并且在内,您需要根据是否为空将其更

  • 抱歉发了“修复我的代码”的帖子 编辑:与循环的语法比质数更相关,现在也解决了。 我的任务是从控制台取一个整数,并打印出(在不同的行上)从1到n的所有素数。我的方法从n开始,检查它的素数,然后将n递增1,并循环直到n=2。为了检查一个数字是否是素数,我运行一个循环,检查跳水的余数x等于零,x从2开始,停止在根(n)。现在这一切在理论上都是可行的,阅读我的代码,我看不出哪里出错了。 例如,输入10将返