一、引子:你至少应该掌握5个异常!
有一道面试题,请说出至少5个异常类,常见异常如下:
IOException:IO流异常
RuntimeException:运行时异常
ClassNotFoundException:没有找到指定的类异常
ClassCastException:类型转换异常
IndexOutOfBoundsException:角标越界异常
InterruptedException:中断时异常
UnknownHostException:未知主机异常
二、异常的概念与体系
Exception(异常):就是程序在运行时出现不正常情况。
由于问题也是现实生活中一个具体的事物,也可以通过Java类的形式进行描述,把问题封装成对象。
异常体系:Throwable
|--------Error:严重的问题,一般不编写针对性的代码对其进行处理;
|--------Exception:可以使用针对性的处理方式进行处理;
三、对异常的处理
1、声明抛出异常
throws:
用在函数上,是用来声明一个方法可能抛出的所有异常信息,声明处的异常类可以跟多个,用逗号隔开;
如:public void method()throwsIOException{...}
throws在方法声明时抛出异常,使程序通过编译,但是要在调用方法时使用try-catch捕获异常;
throw:
用在函数内,用于抛出一个异常类对象,如:throw newRuntimeException(),或者抛出自定义的异常类对象,throw new MyException()
在方法体内部抛出异常时, 要与throws或者try-catch语句块结合使用,否则程序无法通过编译;
注意:
当程序出现异常时,程序不会向下执行,JVM会将异常封装成相应的异常类的对象,然后向外抛出;
对于一个方法的返回值,正常运行时,要求方法必须返回定义的类型,如果不是,运行会出现异常,返回的是异常对象;
抛弃过程中可以对异常类型进行扩展,但是不能缩小。
2、try...catch... finally 处理
示例代码:
try{
需要被检测的代码
}catch(异常类变量){
处理异常的代码
}finally{
一定会被执行的语句
}
注意:
部分情况下,如果没有一定要执行的语句,可以只用try...catch二个模块,finally可以省略;
程序会在return前执行finally里的程序,如果System.exit(0)在finally之前,则不会执行finally里的程序;
一个try语句后可以跟多个catch语句;catch时子类异常放上面,父类异常放下面;
如果抛出的异常不进行try...catch处理,调用时也不处理,而是继续抛出,直到抛出到JVM。
3、自定义异常类型
因为项目中会出现特有的问题,而这些问题并未被Java所描述并封装对象,所以可按Java对问题封装的思想,将这些特有问题进行自定义的异常封装。
package blog.itheima;
//自定义算术异常
class ArithmeticException extends Exception {
private int value;
ArithmeticException(){
super();
}
ArithmeticException(String msg, int value) {
super(msg);
this.value = value;
}
int getValue(){
return value;
}
}
class Demo {
int div( int a, int b) throws ArithmeticException {
if(b<=0)
throw new ArithmeticException("被除以负数或0了,错误",b);
return a/b;
}
}
class ExceptionTest {
public static void main(String[] args){
Demo d = new Demo();
try{
int x = d.div(4,5);
System.out.println("x="+x);
}catch (ArithmeticException e){
System.out.println(e.toString());
System.out.println("错误的数是:"+e.getValue());
}
}
}
四、异常在子父类覆盖中的体现
1、子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类;
2、如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集;
3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常;如果子类方法发生了异常,就必须要进行try...catch处理,绝对不能抛。