Throwable类有两个子类:
|- Exception
|- Error
Throwable 类是 Java 语言中所有错误或异常的超类。
一般来说,程序产生异常是不可避免的,如 由除数为0导致产生的 ArithmeticException 。因此,若咱们在程序中对异常做出了相应的处理,则程序是可以继续向下执行的。
但是,程序在运行的时候是不允许存在错误的。若程序中突然产生了错误,那么程序就没有再继续运行的必要了。常言道“您用谎言去验证谎言,得到的一定是谎言。”程序也一样,“程序中有了一个错误,那么之后程序计算出来的数据,全部都是错误的。”
因此,咱们都是用Exception匹配异常,而不是使用Throwable类。
常见的程序错误:
使用java命令执行一个不存在的类时,就会产生错误:[code=java]D:\>java test
Exception in thread "main" java.lang.NoClassDefFoundError: test
Caused by: java.lang.ClassNotFoundException: test
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)[/code]此时抛出了一个名为 “NoClassDefFound[color=Red]Error[/color]” 的错误。
在java程序设计语言中,异常对象都是派生与Throwable类的一个实例,所有异常都是有Throwable继承而来,但在下一层即分解为两个分支:Error和Exception
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。不过这种情况很少出现。
在进行Java程序设计的时候,需要关注的Exception层次结构。这个层次结构又分解为两个分支:一个分支是派生于RuntimeException的异常;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;曾经能够正确运行,由于某些情况(例如:I/O错误)导致的异常不属于RuntimeException。
如果遇到了无法处理的情况,Java的方法可以抛出一个异常。方法应该在其首部声明所有可能抛出的异常。这样可以从方法的首部反映出该方法可能会抛出哪类已检查异常。
在自己编写方法时,不必将所有可能抛出的对象进行声明。至于什么时候需要在方法中用throws子句声明异常,什么异常必须使用throws子句声明,需要记住在遇到下面4种情况才会抛出异常:
1.调用一个抛出已检查异常的方法
2.在程序运行过程发现错误,并且利用throw语句抛出一个已检查异常
3.程序出现错误
4.Java虚拟机和运行时库出现的内部异常。
Error类和Exception类都继承自Throwable类。 Error的继承关系: java.lang.Object > java.lang.Throwable > java.lang.Error Exception的继承关系: java.lang.Object > java.lang.Throwable > java.lang.Exception 二者的不同之处: Exception: Error: Java 中定义了两类异常:
Java语言要求java程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从Throwable派生而来。当然,实际的Java编程中,由于JDK平台已经为我们设计好了非常丰富和完整的异常对象分类模型。因此,java程序员一般是不需要再重新定义自己的异常对象。而且即便是需要扩展自定义的异常对象,也往往会从Exception派生而来。所以,对于java程序员而言,它一般只需要在它的顶级函数中catch(Exception ex)就可以捕获出所有的异常对象。 所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来(这是java系统所强制要求的),并且它实现了 Serializable接口(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备)。 从Throwable直接派生出的异常类有Exception和Error 。Exception是java程序员所最熟悉的,它一般代表了真正实际意义上的异常对象的根基类。也即是说, Exception 和从它派生而来的所有异常都是应用程序能够catch到的,并且可以进行异常错误恢复处理的异常类型。而Error则表示Java系统中出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如LinkageError ,或 ThreadDeath 等。 |
public class Test{
public static void main(String[] args) {
try {
new Test().nevv();
} catch (ExceptionB e) {
if(e.getCause()==null){
System.out.println("异常B");
}else if(e.getCause() instanceof ExceptionA){
System.out.println("异常A");
}else if(e.getCause() instanceof ExceptionC){
System.out.println("异常C");
}
}
}
public void nevv() throws ExceptionB {
try {
new A();
} catch (ExceptionA e) {
throw new ExceptionB(e);
}catch (ExceptionC e) {
throw new ExceptionB(e);
}
}
}