如何在java中识别已检查和未检查的异常?

Gur*_*lki 14 java exception-handling checked-exceptions unchecked-exception

在阅读关于异常的同时,我总会遇到检查异常和未经检查的异常,所以想知道如何区分哪个是什么?

编辑:我想知道我是否创建了任何异常类,那么我如何创建一个已选中或未选中?

每个人的意义是什么?

Law*_*Dol 18

所有Throwables除了子类java.lang.RuntimeException或被java.lang.Error检查.正确地说,在Java中,"异常"是子类java.lang.Exception,"错误"是子类,java.lang.Error并且java.lang.Throwable通常不直接子类化.

程序不应该创建自己的Error子类(虽然文档相当模糊)所以通常你总是创建Exceptions,使用RuntimeException如果你不希望它被检查.

要在运行时知道您是否有已检查的异常,您可以使用:

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
    // this is a checked Exception
    }
Run Code Online (Sandbox Code Playgroud)

已检查的异常是必须在catch子句中处理或声明为在方法签名中抛出的异常; 编译器强制执行此操作.通常,对于应由调用代码处理的异常使用已检查的异常,而未经检查的异常用于由编程错误导致的条件,并应通过更正代码来修复.

这就是说Java社区中存在很多关于使用已检查异常与未经检查的异常的效果的争论 - 这是在这个答案中深入讨论的主题方式.

编辑2012-10-23:在回应评论(非常有效)时,为了澄清,以下将是确定捕获Throwable是否是已检查 Throwable而不是已检查所需的内容Exception:

if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
    // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
    }
Run Code Online (Sandbox Code Playgroud)

如果已知所讨论的对象是Throwable(例如它被捕获)的实例,则仅需要上述"if"的第二部分(例如,对Throwable的测试是多余的).


Chr*_*oph 5

参见Java语言规范,第11章

未检查的异常类是该类RuntimeException 及其子类,以及该类Error及其子类。所有其他异常类都是检查的异常类。Java API定义了许多异常类,包括检查和未检查两种。程序员可以声明其他已检查和未检查的异常类。

您可以instanceof在运行时通过检查它,尽管我真的看不到它在什么地方有用。

至于问题的第二部分:

  • 检查的异常表示预期的错误情况,该情况可能在正常程序执行期间发生,因此始终必须以编程方式进行处理(编译器强制执行)

  • 未检查的异常表示意外的错误情况,并表示由于无效输入,错误或运行时限制(例如内存)而导致程序的异常状态;编译器不会强迫程序员处理这些问题,即,如果您知道它们的发生,则只需关心它们