直接上代码:
class ExceptionA extends Exception{
//继承自Exception类,为受检查的异常
}
class ExceptionB extends RuntimeException{
//继承自RuntimeException,为不受检查的异常,又称为运行时异常
}
class ExceptionC extends Exception{
//继承自Exception,为受检查的异常
}
public class ExceptionTest {
void throwExceptionA() throws ExceptionA{
//方法本身内部抛出受检查的异常,因此方法要么声明为抛出该异常,要么方法内部处理异常
//这里使用方法声明为抛出异常的方式
throw new ExceptionA();
}
void throwExceptionA2(){
//方法本身内部抛出受检查的异常,因此方法要么声明为抛出该异常,要么方法内部处理异常
//这里使用方法内部处理异常的方式
try {
throw new ExceptionA();
} catch (ExceptionA e) {
e.printStackTrace();
}
}
void throwExceptionA3() throws ExceptionA{
//可以声明抛出异常,但实际上并不抛出任何异常
}
void catchExceptionA(){
try {
} catch (ExceptionA e) {
// error ,试图捕获并处理try块中不可能抛出的受检查的异常将导致编译错误
}
}
void catchExceptionB(){
try {
} catch (ExceptionB e) {
//可以捕获运行时异常,即使try块中不会抛出该异常
}
}
void catchException(){
try {
} catch (Exception e) {
//可以捕获Exception异常,不会引起编译错误
}
}
void invokeA(){
try {
//调用的方法抛出异常,要么捕获异常,要么方法声明抛出该异常
throwExceptionA();
} catch (ExceptionA e) {
e.printStackTrace();
}
}
void invokeA1() throws ExceptionA{
//调用的方法抛出异常,因为没有捕获异常,所以该方法必须声明抛出异常
throwExceptionA();
}
void throwExceptionB() throws ExceptionB {
//ExceptionB为运行时异常,可以只抛出异常,不必在方法声明处声明抛出,也不必捕获处理
//当然也可以在方法处声明抛出,也可以捕获异常
throw new ExceptionB();
}
void invokeB(){
//调用的方法抛出运行时异常,可以不捕获,也可以不声明抛出
throwExceptionB();
}
}
class ExceptionChild extends ExceptionTest{
void throwExceptionA() throws ExceptionC{
//error,子类重写父类中的方法时,可以不抛出异常,但不能抛出新的异常
//这里所谓的新的异常,指的该异常不是父类方法声明中抛出的异常之一,或是其中之一某个的异常子类
//ExceptionC是新的受检查异常,父类方法中没有声明抛出,也不是ExceptionA异常类的子类,故编译错误
//该规则只对受检查的异常有效,对运行时异常无效
}
void throwExceptionA2() throws ExceptionB{
//ExceptionB为运行时异常,不受上面的规则的限制,ExceptionB不是父类方法中抛出的异常,在子类方法中可以抛出
}
void throwExceptionA3(){
//重写父类方法时,可以不抛出相应异常
}
}
以上总结了正常情况下以及继承下编写异常处理模块的一些规则。小结一下:Throwable为所有可以抛出的异常的父类,它包括Error和Exception两个直接子类。所有的受检查的异常均从java.lang.Exception 继承而来,而运行时异常(不受检查的异常)则继承java.lang.RuntimeException 或java.lang.Error。一般而言,Checked Exception 表示这个Exception 必须要被处理,也就是说程序设计者应该已经知道可能会收到某个Exception;而Runtime Exception 通常会暗示着程序上的错误,这种错误会导致程序设计者无法处理,而造成程序无法继续执行下去(可以try catch处理而避免程序挂掉,但是这常常会掩盖问题所在)。
常见的运行时异常有:NullPointerException、NumberFormatException(字符串转换为数字时)、ArrayIndexOutOfBoundsException:数组越界、StringIndexOutOfBoundsException:字符串越界、ClassCastException:类型转换错误、ArithmeticException:算术错误,除数为零、 ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常、ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时、IllegalArgumentException:非法参数、NoSuchElementException等。
常见的受检查异常有:ClassNotFoundException:加载类时没有找到具有指定名称的类的定义、InterruptedException:sleep(),wait(),join()被中断时、NoSuchFieldException、NoSuchMethodException、SQLException:关于数据库访问错误或其他错误信息的异常、TimeoutException,阻塞操作超时、IOException及其子类等。