在阅读有关异常时,我会经常遇到已检查的异常和未经检查的异常,所以想知道如何区分这是什么?
编辑:我想知道我是否创建了任何异常类,那么我如何创建一个已选中或未选中?
每个人的意义是什么?
答案 0 :(得分:18)
检查除Throwable
或java.lang.RuntimeException
的子类之外的所有java.lang.Error
个。正确地说,在Java中,“exception”是java.lang.Exception
的子类,“errors”是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
是否为选中 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
}
如果有问题的对象已知是Throwable
的实例(例如它被捕获),则仅需要上述“if”的第二部分(例如,测试可抛出是多余的。)
答案 1 :(得分:5)
请参阅Java Language Spec, chapter 11:
未经检查的异常类是类
RuntimeException
及其子类,以及类Error
及其子类。所有其他异常类都是已检查的异常类。 Java API定义了许多异常类,包括已检查和未选中的异常类。程序员可以声明其他检查和未检查的异常类。
您可以在运行时通过instanceof
检查这一点,但我真的没有看到它有用的地方。
关于问题的第二部分:
checked exception表示在正常程序执行期间可能发生的预期错误情况,因此总是必须以编程方式处理(编译器强制执行)
未经检查的异常表示意外的错误情况,表示程序的异常状态,原因是输入无效,错误或运行时限制(例如内存);编译器不会强迫程序员处理这些,即如果你知道它们的发生,你只需要关心它们
答案 2 :(得分:1)
如果异常类是RuntimeException
的子类,则不会检查它,也不必为函数声明或捕获等等。Error
异常也不必声明/捕获。这就是你问的问题吗?
答案 3 :(得分:1)
Error
是内部VM错误,通常您无法对其进行管理。 Exception
-您可以抓住并处理它已选中与未选中
try-catch-finally
,throws
IntelliJ IDEA's
Type Hierarchy
工具在您想查找更多内容时很有用
答案 4 :(得分:0)
以前肯定会有人问过并回答过这个问题,但是为了这个问题,这里的内容很清楚:http://www.javapractices.com/topic/TopicAction.do?Id=129。
严格地说,未经检查的异常将始终扩展RuntimeException
,而已检查的异常则不会扩展try/catch
。上述链接说明了何时使用。
正如其名称所示,呼叫者有义务处理已检查异常,通常会处理它们({{1}})或将其进一步传递到堆栈中。未经检查的异常通常被认为是由呼叫者无法控制的元素引起的。
答案 5 :(得分:-2)
package practice;
import java.io.IOException;
class Practice
{
public static void main(String args[])
{
Exception n=new NullPointerException();
if(n instanceof RuntimeException)
{
System.out.println("this is a runtime(unchecked) exception");
}
else
{
System.out.println("this is not a compiletime(checked) exception");
}
}
}