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

在阅读有关异常的信息时,我总是会遇到选中的异常和未选中的异常,所以想知道如何区分那是什么?

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

每种方法的意义是什么?


答案 1

除 或 的子类外,所有 s 都处于选中状态。正确地,在Java中,“异常”是 的子类,“错误”是的子类,通常不直接子类化。Throwablejava.lang.RuntimeExceptionjava.lang.Errorjava.lang.Exceptionjava.lang.Errorjava.lang.Throwable

程序不应该创建自己的子类(尽管文档对此相当模糊),所以通常你总是创建 ,如果你不希望它被检查,请使用。ErrorExceptionsRuntimeException

若要在运行时了解是否有已检查的异常,可以使用:

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
    // this is a checked Exception
    }

已检查的异常是在 catch 子句中处理,或声明为在方法签名中引发的异常;编译器强制执行此操作。通常,对于应由调用代码处理的异常,使用已检查的异常,而未检查的异常用于由于编程错误而产生的条件,应通过更正代码进行修复。

也就是说,在Java社区中,关于使用检查异常与无处不在的未检查异常的有效性存在很多争论 - 这是一种深入讨论这个主题的方式。

编辑 2012-10-23:为了响应注释(这些注释非常有效),为了澄清,以下是确定捕获的是否为已检查的可抛出项而不是已检查的异常所需的内容Throwable

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

如果已知有问题的对象是的实例(例如,它被捕获),则只需要上述“if”的第二部分(例如,对Shrewable的测试是多余的)。Throwable


答案 2

请参阅 Java 语言规范,第 11 章

未经检查的异常类是类及其子类,以及类及其子类。所有其他异常类都经过检查的异常类。Java API 定义了许多异常类,包括选中和未选中。程序员可以声明其他异常类(包括选中的和未选中的)。RuntimeExceptionError

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

至于你问题的第二部分:

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

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


推荐