Java异常总结
Java提供了大量的异常类,这些类都继承子java.lang.Throwable类
首先看一下Throwable的继承体系
Error:一般是指与虚拟机相关的问题,如:系统崩溃、虚拟机错误、内存空
间不足、方法调用栈溢出等。这类错误将会导致应用程序中断,不做针对性
处理。直接修改代码。
Exception:分为运行时异常和编译时异常。
-
运行时异常:如:空指针异常、指定的类找不到、数组越界、方法传递
参数错误、数据类型转换错误。可以编译通过,但是一运行就停止了,
程序不会自己处理;
-
编译时异常:要么用 try … catch… 捕获,要么用 throws 声明抛出,交给父类处理。
异常的处理
1.遇到问题不进行具体的处理,而是继续抛给调用者。其实就是在函数上通
过throws关键字声明异常。告诉调用者处理
2.针对性的处理方式:用try/catch 捕获!
throw和throws区别
throws:在方法声明后面,用来声明异常,让调用者只知道该功能有可能出
现的问题,并由调用者可以给出预先的处理方式。
throw:在方法体内部,抛出具体问题对象。执行到throw功能就已经结束
了,跳转到调用者。并将具体的问题对象也抛给调用者。
异常处理的原则
-
功能内部有异常throw抛出,功能上一定要throws声明。
内部抛什么,功能上就声明什么。
声明的目的就是为了让调用者处理,如果调用者不处理,编译失败。
-
特殊情况:
当函数内通过throw抛出了RuntimeException及其子类的异常对象时,函数上可以不用throws声明。
不声明的目的就是不让调用者处理。让调用者的程序停止。要对代码进
行修改。
覆盖时的注意事项
-
子类方法覆盖父类方法只能抛出父类方法异常或者该异常的子类。
如果父类方法抛出多个异常,子类只能抛出父类异常的子集
原则:就是子类的异常必须要在父类的异常处理控制中。
-
注意:有一种情况,只能try不能throws。
被覆盖的方法没有抛出异常。
那么子类在覆盖时,子类方法中发生了异常,就只能try/catch捕获异常无法 throws声明。