异常

所有异常都继承Threwable
异常分两种:1 Error 2 Exception
1 Error系统未知的错误,系统内部错误
2 运行时异常,都继承自Exception
2.1 Exception有很多子类,为什么需要这些子类?为了方便定位问题
3 处理异常,捕获异常
try{
//有可能发生异常的代码段
}catch(异常类型 对象){
//异常处理的操作
}catch(异常类型 对象){
//异常处理的操作
}catch(Exception e){
//异常处理的操作
}
finally{
//异常的同意出口
try{
//有可能发生异常的代码段
}catch(异常类型 对象){
//异常处理的操作
}
}
程序里可以用多个catch来捕获异常
可以再用一个父类异常Exception写在分类异常的最后捕获不可预知的异常
finally里的无论如何都会执行,一般做资源的回收;finally里有异常也是可以用try catch捕获异常的
例:
在附图中的finally里若是文件不存在,那么reader就是null,那就根本谈不上需要回收资源,也会报空指针异常,那么在finally里的最后也用Exception来catch未知异常异常
4 不处理异常,将异常抛出
异常不做处理,就直接抛出异常,谁调用谁处理
类、方法上都可以抛出异常,方法上和类上都可以抛出多个异常,用逗号分隔就好
例方法上,类上同理:public void test throws IOException,FilenotFoundException{};
抛出异常(抛出父类异常):throws Exception
也可以抛出具体异常:throws IOException、throws FilenotFoundException…
5 抛出的异常谁处理? jvm处理
6 抛出异常的弊端
6.1抛出的异常有可能阻断方法的继续执行,异常是可以一层一层抛出的,直到抛给jvm
6.2 在方法中出现异常的位置,因为方法没有捕获异常,那么出现异常位置之后的代码就不会被执行
7 对于异常的友好处理
7.1自己能处理的异常不抛出,要不然别人调用该方法不友好,自己用别人没有捕获异常的方法要先捕获异常,要不然有可能中断影响自己的程序
7.2 若一定要抛出异常,就抛出一个具体的异常,别人调用时好捕获
8 如何自己创建一个异常,然后捕获该异常
8.1 创建一个异常类继承Exception,创建一个带参的构造方法调用父类构造方法,传入方法参数

public class MyException extends Exception{
	MyException(String message){
    super(message);
	}
 }

8.2 创建一个方法抛出上面创建的异常

public void errorMonth(int month)throws MyException{
    if(month<1&&month>12){
        throw new MyException("输入月份错误");
    }
}

8.3调用上面抛出异常的方法,就必须try catch异常,否则报错

 @Test
public void tests(){
    try {
        this.errorMonth(13);
    } catch (MyException e) {
        e.printStackTrace();
    }
}

一个类上或者方法上有throws …Exeption那么调用这个类或者调用这个方法就要对该抛出的异常做处理,1 继续抛出 2 try catch