java异常02:异常处理机制

异常处理机制

  1. 异常处理机制
  • 在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: 用在方法签名中,用于声明该方法可能抛出的异常。
  1. 捕获异常

什么是捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(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("关闭异常处理,减少资源浪费");
         }
   }
}
  1. 抛出异常

当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

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 
   {
       
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值