【问题标题】:How to know if my code is using a checked or an unchecked exception?如何知道我的代码是使用检查异常还是未检查异常?
【发布时间】:2017-10-25 02:31:29
【问题描述】:

是否有任何关键字或特殊语法的代码,如果我查看它,我会知道这里使用的是未经检查的异常还是使用了已检查的异常?

通过阅读之前提出过这个问题的帖子,在我看来,知道它是检查还是未检查的唯一方法是查看异常是扩展 Exception 还是 RuntimeException。

真的只有这样才能知道吗?因为我认为编写未检查和检查异常的语法也应该不同,但我不确定要查找什么。

【问题讨论】:

  • 您正在使用检查异常的 sign 是您有 try/catch 块或方法在签名中有 throws。这不是万无一失的,因为您也可以捕获/抛出未经检查的异常;并且您可以“过度捕获”/“过度抛出”过于广泛的异常(例如,当实际上仅抛出 RuntimeException 时,您可以捕获/抛出异常);但由于您必须对已检查的异常执行其中一项操作,这表明它们可能正在被使用。
  • 我的问题是你为什么想知道?知道这些信息会对您产生什么影响?是单纯的学习区别,还是有更实际的目的?
  • 查看它是否扩展了 RuntimeException 或 Error。这些是唯一不受检查的事情。没有关键字或不同的语法。
  • 老实说,我想知道的原因是因为我的作业要求证明我在代码中使用检查或未检查异常的原因。但是,在我写完代码(并且它可以工作)之后,我不知道我所做的事情是经过检查还是未经检查,因为我仍然不明白其中的区别。
  • 显示您的代码。

标签: java exception checked-exceptions unchecked-exception


【解决方案1】:

来自 Java 文档。它说“异常类和任何不是 RuntimeException 子类的子类都是检查异常。”所以你的答案是肯定的。但请记住,Error 也是一种未经检查的异常。

检查的异常需要在方法或构造函数的 throws 子句中声明,如果它们可以被方法或构造函数的执行抛出并传播到方法或构造函数边界之外。从你可以在 Java 中使用“isInstance()”函数查看特定异常是否属于某个类。在您的情况下,如果异常是 RuntimeException。如果是,则不选中,如果否,则选中。

您还可以查找“java.lang.Object.getClass()”,它可以告诉您对象的确切运行时类。

我可以考虑单独处理它们的另一种方式。您可以捕获 RuntimeException 和 Error,然后捕获所有其他不是 RuntimeException 实例的异常。

【讨论】:

    【解决方案2】:

    实际上,当您预计程序中会出现异常并且您希望调用者处理它时,会使用已检查异常。

    例如

    当你从 FileSystem 读入一个文件时,有可能该文件不存在,所以IOException 将被抛出,调用者必须由try..catch 处理它。这样的异常只是你的程序的一个异常流程,它根本不是一个错误。

    当您认为它根本不可能发生时,使用未经检查的异常。

    例如

    当你比较两个字符串a.equals(b)时,你不会期望a为空,所以你不会检查NullPointerException是否会被抛出。如果它真的抛出一个未经检查的异常,那么你的程序中就有一个错误。

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多