如何在java中识别已检查和未检查的异常?
在阅读有关异常的信息时,我总是会遇到选中的异常和未选中的异常,所以想知道如何区分那是什么?
编辑:我想知道如果我创建了任何异常类,那么我如何创建为已选中或未选中?
每种方法的意义是什么?
在阅读有关异常的信息时,我总是会遇到选中的异常和未选中的异常,所以想知道如何区分那是什么?
编辑:我想知道如果我创建了任何异常类,那么我如何创建为已选中或未选中?
每种方法的意义是什么?
除 或 的子类外,所有 s 都处于选中状态。正确地,在Java中,“异常”是 的子类,“错误”是的子类,通常不直接子类化。Throwable
java.lang.RuntimeException
java.lang.Error
java.lang.Exception
java.lang.Error
java.lang.Throwable
程序不应该创建自己的子类(尽管文档对此相当模糊),所以通常你总是创建 ,如果你不希望它被检查,请使用。Error
Exceptions
RuntimeException
若要在运行时了解是否有已检查的异常,可以使用:
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
请参阅 Java 语言规范,第 11 章:
未经检查的异常类是类及其子类,以及类及其子类。所有其他异常类都经过检查的异常类。Java API 定义了许多异常类,包括选中和未选中。程序员可以声明其他异常类(包括选中的和未选中的)。
RuntimeException
Error
你可以在运行时通过检查它,尽管我真的看不出这在什么地方有用。instanceof
至于你问题的第二部分:
检查的异常表示预期的错误条件,这些条件可能发生在正常程序执行期间,因此始终必须以程序方式处理(编译器强制执行)
未经检查的异常表示意外的错误情况,并表示由于无效输入,错误或运行时限制(例如内存)而导致的程序的异常状态;编译器不会强迫程序员处理这些,即你只需要关心它们,如果你知道他们的发生