异常 Exception
不正常,没有按照原有计划执行
在java中,用来描述现实生活中的问题这一类事物 ,并将问题封装成对象。
编译器能够发生的错误叫做编译错误 不叫异常
异常是在运行时发生的不正常情况。
异常的分类
Throwable 所有异常的父类
有两个子类:Error Exception
对于严重的问题 java是通过Error类来进行描述
Error:硬件,虚拟机在运行期间发生的错误,程序员不需要关心如何处理
对于不严重的问题 java是通过Exception类来进行描述
出现exception异常程序员必须给出相应的处理方案
java异常处理机制:
try{
//可能会出现异常的代码块
}
catch(异常类型1 异常对象名1){
//处理异常的代码块
}
catch(异常类型2 异常对象名2){
}....
异常处理过程:
1.抛出异常
2.捕获异常
3.处理异常
注意:
1.try里面一旦抛出异常立马跳到catch中处理,try里面没有异常抛出。跳过catch执行后续代码。
2.当异常处理的代码执行结束后,不会回到try中去执行尚未执行的代码.
throws
声明方法 可能会发生哪些异常
throws后面,可以跟多个异常类型,中间用逗号隔开
throws抛出的异常,由调用者来解决
throws和trycatch区别:
trycatch 自行处理异常 不需要外部了解出现的问题
throws 让调用者来处理异常 需要外部关心出现的问题
自定义异常:
自定义异常类 extends Exception
并且提供构造方法
throw 和 throws 区别:
throws用在方法定义上 表示会引发的异常可能性
throw明确抛出某个异常对象
Exception体系中:
RuntimeException extends Exception extends Throwable
RuntimeException运行时异常 / 非检查性异常
如果出现该类异常,不必在程序中声明对该类异常的处理,就可以通过编译。
Exception检查性异常 /非运行时异常
如果出现该类异常,必须给出相应的处理代码,否则无法通过编译。
运行时异常:
NullPointerException
ArrayIndexOutOfBoundsException
ArithmaticException
ClassCastException
检查性异常:
FileNotFoundException
IOException
ClassNotFoundException
解决异常:
从堆栈信息从上往下找 找第一行自己写的代码
如果有caused by 从caused by第一行开始找
方法重写中声明异常的原则:
子类声明的异常范围不能超过父类声明异常范围
1.父类没有声明异常,子类不能声明异常
2.不可以抛出重写方法抛出的异常类的父类或者上层类
3.抛出的异常类型数目 不可以 比 原有方法还多 (不是指的个数 是类型)
以上限制只针对检查性异常
---------------------------------------------------------
try{
}
catch(){
}
finally{
//不管是否有异常产生 都要执行的代码块
//一般会存放关闭资源相关的代码
}
try{
连接数据库
数据操作 // throw new SQLException("数据库访问失败");
}
catch(SQLException e){
对数据库进行异常处理
throw new SerivceException("服务器正忙");
}
finally{
关闭数据库 //无论数据操作是否成功 一定要关闭资源
}
try{}catch(){}...finally{}
try{}fianlly{}
try{}catch(){}...
return 和 finally 执行顺序:
1.先执行try catch 遇到return 保存返回值
2.执行finally
3.方法结束 返回值
此时,return的作用:把某个值放到方法区的返回值区域内,并没有结束方法。