JavaSE 基础(十)异常机制

1. Error 和 Exception

  • 异常指程序运行中出现的非预期状况,如:网络连接失败、非法参数等。

  • 异常机制结构

    异常体系结构

    • 检查型异常:通常由用户错误引起,程序员无法预见。
    • 运行时异常:通常由程序逻辑引起,程序员可预见。
    • 错误(ERROR):错误不是异常,是脱离程序员控制的问题,编译时也无法检查,往往是致命的。

2. 异常处理

  • 捕获异常

    • 使用 trycatch 关键字可以捕获异常。try 代码块存放可能发生异常的代码,catch 代码块存放处理异常的代码。

    • catch 语句包含要捕获异常类型的声明(括号中的代码)。当 try 代码块中发生一个异常时,catch 块就会被检查。

    • 如果发生的异常包含在 catch 语句的异常类型的声明中,异常会被传递到该 catch 块。

      try{
         // 程序代码
      }catch(ExceptionName e1){
         // catch 块
      }
      
  • 多重捕获

    • 一个 try 代码块后面可跟随多个 catch 代码块进行多重捕获,异常的声明通常由小(范围)到大(范围)。

      try{
         // 程序代码
      }catch(异常类型1 异常的变量名1){
        // 程序代码
      }catch(异常类型2 异常的变量名2){
        // 程序代码
      }catch(异常类型3 异常的变量名3){
        // 程序代码
      }
      
  • throw/throws 关键字

    • throws 关键字放在方法签名的尾部,用来抛出检查该方法捕获的异常。

    • throw 关键字放在代码块之中,即可抛出新实例化的,也可以抛出刚捕获的。

      //随便扒了一个示例
      public class className
      {
         public void withdraw(double amount) throws RemoteException,
                                    				  InsufficientFundsException
         {
             // Method implementation
             throw new RemoteException();
         }
         //Remainder of class definition
      }
      
  • finally 关键字

    • finally 关键字用来创建在 try 代码块后面执行的代码块。

    • 无论是否发生异常,finally 代码块中的代码总会被执行。

    • finally 代码块中,通常存放清理类型等收尾善后性质的语句。

      try{
        // 程序代码
      }catch(异常类型1 异常的变量名1){
        // 程序代码
      }catch(异常类型2 异常的变量名2){
        // 程序代码
      }finally{
        // 程序代码
      }
      
  • 注意事项

    注意下面事项:

    • catch 不能独立于 try 存在。
    • try/catch 后面添加 finally 块并非强制性要求的。
    • try 代码后不能既没 catch 块也没 finally 块。
    • try, catch, finally 块之间不能添加任何代码。

3. 自定义异常

  • 步骤

    • 创建自定义异常类,继承 Exception
    • 通过 throw 抛出异常。
    • 异常处理
      • 在方法调用处使用 try/catch 捕获并处理。
      • 在方法声明处使用 throws 抛给调用者异常信息,再做下一步处理。
    • 在出现异常方法的调用者处捕获并处理。
  • 举个栗子

    • MyException.class

      public class MyException extends Exception {
          //传递一个参数
          private int num;
          public MyException(int num) {
              this.num = num;
          }
          //打印异常信息
          @Override
          public String toString() {
              return "MyException:" + "num=" + num;
          }
      }
      
    • Test.class

      public class Test {
          //可能存在异常的方法
          static void test(int num) throws Exception{
              //数字小于0抛出异常
              if(num < 0){
                  throw new MyException(num);
              }
              System.out.println("无异常");
          }
      	//测试
          public static void main(String[] args) {
              try {
                  test(-1);
              } catch (Exception e) {
                  System.out.println("异常 => " + e);
              }
          }
      }
      

      在这里插入图片描述

4. 异常小结

  • 处理运行时异常,采用逻辑合理规避或使用 try/catch 进行处理。
  • 在多重 catch 块后,可以加一个 catch(Exception e) 处理可能被遗漏的异常。
  • 处理异常时,切忌只是调用 printStackTrace() 打印输出,要根据不同需求添加代码逻辑处理。
  • 尽量添加 finally 语句释放资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值