处理异常的两种方式:
1.抛出去(交给JVM处理
格式:在方法的声明后面加关键字
方法声明(形参)throws 异常类名{
}
注意:
a.可以同时抛多个异常,中间用逗号分割
b.抛出了父类型的异常,子类型的异常就可以不同
c.运行时期编译异常可以不处理
d.编译时期异常必须处理
2.抓起来(自己处理)
格式:
try{
可能出现问题的代码;
}catch(异常类名 对象名){//捕获到异常就执行
你解决这个异常的方案;
}finally{
最终的代码块,无论如何需要执行的代码块
}
try{}catch{}finally{}的执行流程
1.try中无异常
try之前的代码->try中代码->final中的代码->try之后的代码
2. try中有异常 前提:catch捕获到了异常
try之前的代码->tr->遇到异常立即终止->catch-->finally->try之后的代码
3. catch没有捕获到异常:
try之前的代码->try->遇到异常立刻终止try中代码执行->检测catch是否捕获到-否->交给JVM处理->finally
注意:
1.catch父类异常也能抓到子异常-->多态
2.一个catch中只能捕获一个个异常
3.一个try..catch中可以写多个catch
4.父类型异常的捕获必须写在异常捕获的后面
5.finally代码块只要在JVM退出的情况下不会执行
异常对象的方法
异常对象的功能:
String etMessage():获取异常信息
String toString():获取异常类型+异常信息
*void printStackTrace():打印+异常类型+异常信息+异常产生的位置+红色字体+开新线程
JVM处理异常时,异常对象调用的方法就是printStackTrace()
在方法内定义异常并暴露
一个方法的调用之所以有异常产生,原因是程序员在方法内使用throw关键字暴露并创建异常对象
格式:
throw new 异常对象();
注意:
1. 如果你在方法内暴露的是一个编译时期异常,方法本身也要处理此异常(一般情况下是抛出)
2. 若方法内部就try..catch处理了异常,那么再次调用有异常的方法时就不需要处理异常
3. 若方法内throw的是一个运行时期异常,那么异常可以不处理
4. 若没有写throw,只是创建异常对象没有暴露,没暴露异常机制不会触发
自定义异常
创建自定义异常类的步骤:
第一步:创建一个类,类名: XxxxxException
第二步:思考创建的异常是编译时期异常还是运行时期异常
编译时期异常: 你就让创建的异常类继承Exception
运行时期异常: 你就让创建的异常类继承RuntimeException
第三步: 自动生成2个构造方法: 无参的和带有String message参数的构造方法
如何使用自定义异常:
在方法内定义异常并暴露;