异常处理机制
- 异常处理机制
- 在Java中异常处理机制为:抛出异常和捕获异常
- 异常处理的5个关键字是捕获异常的try,catch,finally和抛出异常的throw和throws
- try : 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
- catch :用于捕获异常。catch用来捕获try语句块中发生的异常。
- finally : finally语句块总是会被执行。它主要用于回收在try块里打开的资源(如数据库连接、网络连接和磁盘文件)。 注意:只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw 语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
- throw : 用于抛出异常。
- throws: 用在方法签名中,用于声明该方法可能抛出的异常。
- 捕获异常
什么是捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止
捕获异常特点:
- 当我想用a除以b时就会出现算术异常,除数不能为0,所以我们就要使用try,catch来捕获我们的异常并且返回一些我们想要的信息
- 无论try,catch有没有捕获到异常,finally语句块总是会被执行。
- catch语句不止可以写一个而可以写多个,而且捕获的异常范围从小到大,不然大范围的异常捕获了就不会执行下面的语句了.
- idea快捷键ctrl+alt+t
- 对于try-catch-finally语句:先执行try 块中的代码,如果正常运行没有发生异常则执行完后执行finally 代码块中的代码;如若在try 中发生异常且被catch 捕捉到则执行catch 中的代码块,然后执行finally 块中的代码;
- try 后面的花括号{ }不可以省略
public class Test{
public static void main(String[] args){
int a=1;
int b=0;
//当我想用a除以b时就会出现算术异常,除数不能为0
//所以我们就要使用try,catch来捕获我们的异常并且返回一些我们想要的信息
try{//用于监听,监控区域
System.out.println(a/b);
}catch(ArithmeticException e){//catch 捕获异常
System.out.println("出现算术异常,除数不能为0");
}
catch(Error c){//catch 捕获异常
System.out.println("Error");
}
catch(Throwable e){//捕获异常范围最大
System.out.println("Throwable");
}finally{//处理善后工作
System.out.println("关闭异常处理,减少资源浪费");
}
}
}
- 抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
throw的特点:
- throw:主动抛出异常 ,一般在方法中使用
- 如果要捕捉throw抛出的异常,则必须使用try-catch语句块或者try-catch-finally语句。
- 当 throw 语句执行时,它后面的语句将不执行,此时程序转向调用者程序,寻找与之相匹配的 catch 语句,执行相应的异常处理程序。如果没有找到相匹配的 catch 语句,则再转向上一层的调用程序。这样逐层向上,直到最外层的异常处理程序终止程序并打印出调用栈情况。
throw 关键字不会单独使用,它的使用完全符合异常的处理机制,但是,一般来讲用户都在避免异常的产生,所以不会手动抛出一个新的异常类的实例,而往往会抛出程序中已经产生的异常类的实例
public class Test{
public static void main(String[] args){
Demo6 demo6= new Demo6();
demo6.division(1,0);
try{//用于监听,监控区域
System.out.println(a/b);
}catch(ArithmeticException e){//catch 捕获异常
System.out.println("出现算术异常,除数不能为0");
}
}finally{//处理善后工作
System.out.println("关闭异常处理,减少资源浪费");
}
}
public void division(int a,int b){
if(b==0){
throw new ArithmeticException();
}
}
}
throws的特点:
- throws:假设这个方法中处理不了这个异常(不能通过类似if语句来处理),我们就在方法上抛出异常,向上抛出异常,多个异常可使用逗号分隔
- 使用 throws 声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由向上一级的调用者处理;如果 main 方法也不知道如何处理这种类型的异常,也可以使用 throws 声明抛出异常,该异常将交给 JVM 处理。JVM 对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因。
public class Test{
public static void main(String[] args){
Demo6 demo6= new Demo6();
demo6.division(1,0);
}
//把异常抛到更高级的地方,让调用division方法的人来捕获这个异常
public void division(int a,int b) throws ArithmeticException
{
}
}