一.异常分类
二.异常的基本概念
-
Java API中定义了许多异常类,异常类分为两大类,错误error,异常Exception
-
Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
-
检查性异常
-
运行时异常
-
-
错误(error)一般和JVM相关的
-
异常处理的五个关键字(
try
,catch
,finally
,throw
,thrws
)
错误:
public class dome01 {
public static void main(String[] args) {
new dome01().test();
}
public void test(){//不断的在栈中开辟栈针会导致栈溢出
test();
}
}
异常:
public class dome01 {
public static void main(String[] args) {
System.out.println(4/0);
}
}
声明受查异常
声明受查异常 说名会出现ParseException异常,会提醒调用者有受查异常,调用者可以选择声明异常或让下个调用者选择,或捕获异常并处理。
声明异常的注意事项
- 子类重写父类的方法,子类的方法可以不声明异常,如过要声明异常那么必须声明与父类相同的异常或父类异常的异常子类。
- 如何父类声明的多个异常,子类可以不声明异常,或声明部分和父类相同的异常或父类异常的异常子类。
- 被重写的方法父类没有声明异常,子类也不能声明异常。
- 接口定义声明了异常,接口实现类可以不声明异常,如果要声明异常那么必须与接口相同的异常类型或其子类。
三.抛出异常
抛出异常的概念
在编写程序过程中去判断程序中可能发生的异常点,在代码中对可能发生的异常点主动去抛出指定的异常。
throw 异常类型;
抛出异常是在堆内存创建异常对象,使用throw抛出具体的异常类型。
比如:抛出Exception可写成
throw new Exception(“错误”);
要抛出一个受查异常,要莫捕获,要么声明。
抛出非受查异常,不需要声明,也不需要捕获。
四.捕获异常
try/catch捕获异常
当异常发生时通常需要捕获异常,不管是受查异常或非受查异常,捕获异常的目的就是为了得到异常信息进一步处理异常。
public void add(int a,int b){
if(b==0){
throw new ArithmeticException("异常信息");//主动抛出异常 一般在方法中使用
}
//抛出异常后下面的语句就不执行了
//语句1
}
//语法如下:
try{
add();
//可能出现异常的代码
}catch(异常类型 变量名){// 异常类型 变量 = new 抛出的异常;
//如抛出的异常是catch中异常类型子类那么这里存在向上转型.
e.printStackTrace();//打印出异常栈信息
System.out.println(变量名.getMessage());
//异常处理
}
//同级别的异常,不分别进行捕获特殊处理。
try{
}catch(异常1 | 异常2 e){//注意异常1和异常2必须是同一级别的异常才能这样写。
//异常处理
}
捕获异常不处理,选择继续抛出异常,或统一异常类型。
public static void test() throws Exception{
try{
//可以发生异常的代码
}catch(Exception e){
//统一异常处理
Exception exception = new Exception("更改了异常类型");
//保存原始异常信息
exception.initCause(e);
throw exception;//注意:抛出的异常必须要和声明的异常匹配
//选择继续抛出异常
throw e;//如是检查异常需要声明
}
}
public static void main(String[] args){
test();//选择声明或捕获异常
}
finally
(始终)执行的代码?
//异常语句
try{
}catch(){
}finally{
//(始终)执行的代码,前提是要进入try/catch里,如在try前就有异常抛出,则不会执行后面的代码。
}
当我们不需要捕获异常时,可以使用try/finally。
try{
//会把异常继续抛出给main
}finally{
//相当于捆绑操作
try{
//可能的异常语句
}catch(Exception e){
e.printStackTrace();
}
}
五.自定义异常
在实际开发中,会根据具体业务实现 对应的异常。
//继承非受查异常
public class TestException extends RuntimeException{
private String mag;//记录异常信息
public void getMag(){
return mag;
}
public String setMag(String mag){
this.mag = mag
}
public Test(){
super();
}
public Test(String mag){
super(mag);
this.mag = mag;
}
}
public class dome{
public static void test(){
throw new TestException("自定义异常");
}
public static void main(String[] args){
try{
//异常
]catch(自定义异常 变量){
System.out.println(变量.getMag());//获取异常信息
变量.printStackTrace();
}catch(Exception e){
//一般最大的异常都在最低下尼
}
}
}