一、异常
1、概念
程序在编译运行的过程中遇到的种种不正常的现象
Java中所有的异常都是Throwable类的子类,Throwable类主要描述了各种不同的异常,因此,Java中的每个异常都是对象
2、分类
Throwable类:所有错误或者所有异常的父类,有两个子类:
Error:大多数的错误与代码编写者无关,表示JVM层面的问题
Exception:程序能够捕获并且解决的问题
CheckedException:编译时异常,程序在编译时出现异常,这种异常必须处理,否则程序没有执行的寄回
RuntimeException: 运行时异常,程序编译可以通过,但是运行的过程中出现异常
3.处理异常的方法
在Java中,处理异常的机制:捕获,抛出异常
1>捕获异常
语法:
try{
//可能存在异常的代码
}
catch(异常的种类){
//异常的信息
}
finally{
}
在try块中遇到了异常,代码将不会继续向下执行,所以每次只能捕获一个异常
一个try后面可以有多个catch块
如果catch中的异常类型直接没有继承关系,则catch块的顺序没有要求,但是有继承关系,则子类必须在前,父类在后
finally块写在try-catch的最后,表示不管try中的代码不会产生异常,或者某个catch会不会被执行。
finally块都会被执行
执行顺序:try-catch-finally
finally只要用于流中,用于关闭流,为了释放与当前流有关的资源
特殊情况:如果在try或者catch中出席那了return语句,finally依旧会被执行
catch块结束之后,方法执行之前 finally块执行
特殊用法:在finally中嵌套try-catch-finally 主要用于流中
7、返回异常 获取异常的原因
对象的错误跟踪信息输出到错误的输出流
e.printStackTrace();
返回异常的错误信息
System.out.println(e.getMessage());
扩展:finally不会被执行的情况
a、在前面的代码中出现了System.exit()退出程序
b、程序所在的线程死亡【stop()】
c、cpu关闭
扩展二:注意问题
a、如果一个程序中有多个异常,可以直接用一个catch,类型直接使员工Exception
b、try-catch-finally三个关键字都不能单独使用
c、一个变量如果想要在try,catch或者finally中都能访问到的话,只能定义在语句外
总结:
a、try中语句没有异常:try中语句会依次执行,程序会直接跳过catch语句,执行finally中的语句
b、try中出现异常,但是异常没有被处理【没有匹配到对应的catch块】,则这个异常最终给了JVM处理,finally块中的代码依旧会执行
c、try中出现了异常,并且匹配到了对应的catch块,try-catch-finally
try-catch就是把异常屏蔽了没有真正的解决
2>抛出异常
throw:抛出一个异常对象,调用这异常所在的方法的时候则会遇到异常
throws:定义在方法的声明部分,用来表示一种可能性【当前方法有可能存在异常】
throw和throws并不是必须成对出现
如果抛出的是编译时异常,throws必须要写
如果抛出的是运行是异常,throws必须要写
throws可以单独使用
注意:
a、throws必须出现方法的声明部分,throw出现在方法体
b、throws只表示一种可能性,并不一定发生异常,throw则是直接抛出异常,执行到了throw则一定抛出了某个异常对象
c、throws和throw都是一种消极的处理问题的方式,所以异常不会真正被处理的
3>自定义异常
当系统的异常不能解决某些问题,需要自定义异常
就是对于throw关键字的应用
实现方式:
继承自Exception,是编译时异常【运行时异常提前到编译时】
继承自RuntimeException,是运行时异常