1 概述
Java程序在运行过程中出现的错误,如除数为零、空指针、数组越界等
2 分类
Throwable:异常类的父类
Error:极其严重的问题,如内存溢出,我们不作处理
Exception
RuntimeException:运行时异常,一般是代码不够严谨导致,需要修改代码,所以也不处理
编译是异常:Exception 中除去 RuntimeException 部分,必须处理,因为不处理不能通过编译。
3 异常处理
如果我们没有处理异常,JVM 会做出默认处理:将异常名称、原因及出现的问题输出在控制台,并结束程序。
处理格式:
JDK7 以前
注意:
try{} 中的代码越少越好,尽可能明确 catch 中的异常类型,如果实在不清楚,可以用父类替代,并且辈分越高的异常越放在后面。
catch(Exception e){} 中必须有内容,即便是一个提示消息
当 try{} 中有多个异常时,一旦异常出现,出现异常后面的代码将不会被执行
JDK7 以后
注意:
该代码虽然简洁,但是不同的异常处理却是相同的,而且各个异常必须是同辈的异常
即便是try和catch中有return语句,finally中的语句也会被执行
如图中代码所示
当程序执行到 catch 中 return a 时,就已经形成了return 30 的返回路径。但因为有 finally,所以程序会跳转到 finally 并执行,等待 finally 中的语句执行完毕后在执行 return 30。
4 异常声明和抛出
- 声明异常
使用 throws 关键字在方法后面声明抛出异常
注意:
throws 必须跟在方法后面,并且可以声明抛出多个异常,用 "," 隔开即可。
尽量不要在main()上声明抛出异常
- 抛出异常
格式:throw 异常对象
例: throw new Exception("抛出一个异常");
5 throw 和 throws 的区别
- throw
用在方法体内,跟的是异常对象
只能抛出一个异常对象
表示抛出一个异常,由方法体内的语句处理
执行throw一定抛出了某种异常
- throws
用在方法声明后面,跟的是异常类名,可以多个异常类名,用逗号隔开,表示方法可能抛出异常,由方法的调用者处理
执行throws表示可能出现异常,但不一定会发生
- 注意
子类重写父类方法时,子类的方法只能抛出父类方法声明的异常或其子异常
父类方法如果声明抛出多个异常,子类重写方法声明抛出的异常只能是父类方法声明抛出异常的子集
如果父类方法没有声明抛出异常,那么子类也不能声明抛出异常