Java 异常

Error和Exception

  • 异常(Exception)指程序运行中出现的预期之外的情况,如:文件找不到,网络连接失败等。
  • 异常发生在程序运行期间,它影响了正常的程序执行流程。
  • 分类:
    • 检查性异常:代表性的异常是用户错误或者问题引起的异常,如打开一个不存在的文件引起的异常。这些异常在编译时不能被简单的忽略。
    • 运行时异常:指可能被程序员避免的异常,运行时异常可以在编译时被忽略。
    • 错误 Error:不是异常,而是脱离程序员控制的问题。错误在代码中常会被忽略,比如,当栈溢出时,一个错误就发生了,它们在编译时也是检查不到的。
  • 异常体系结构:
    • Java 把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
    • 在 Java API中已经定义了许多异常类,这些异常类分为两大类,错误 Error 和异常 Exception。
      • error 类对象由 Java 虚拟机生成并抛出,大多数错误和代码编写者无关

捕获和抛出异常

  • 捕获异常

    • 使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

      try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

      try
      {
         // 程序代码
      }catch(ExceptionName e1)
      {
         //Catch 块
      }
      
      
      // 文件名 : ExcepTest.java
      import java.io.*;
      public class ExcepTest{
       
         public static void main(String args[]){
            try{
               int a[] = new int[2];
               System.out.println("Access element three :" + a[3]);
            }catch(ArrayIndexOutOfBoundsException e){
               System.out.println("Exception thrown  :" + e);
            }
            System.out.println("Out of the block");
         }
      }
      
      //输出:
      Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
      Out of the block
      

      Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

      如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

    • 多重捕获:

      try{
         // 程序代码
      }catch(异常类型1 异常的变量名1){
        // 程序代码
      }catch(异常类型2 异常的变量名2){
        // 程序代码
      }catch(异常类型3 异常的变量名3){
        // 程序代码
      }
      

      上面的代码段包含了 3 个 catch块。

      可以在 try 语句后面添加任意数量的 catch 块。

      如果保护代码中发生异常,异常被抛给第一个 catch 块。

      如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

      如果不匹配,它会被传递给第二个 catch 块。

      如此,直到异常被捕获或者通过所有的 catch 块。

      try {
          file = new FileInputStream(fileName);
          x = (byte) file.read();
      } catch(FileNotFoundException f) { // Not valid!
          f.printStackTrace();
          return -1;
      } catch(IOException i) {
          i.printStackTrace();
          return -1;
      }
      
  • 抛出异常

    • 使用 throw 和 throws 来抛出异常,其中 throw 用来在代码抛出异常,throws 用于在方法声明中指定可能会抛出的异常类型。

      • throw 用于在当前方法中抛出一个异常。正常情况下,当代码执行到某一个条件时无法继续正常执行时,可以通过 throw 抛出异常让程序员了解当前代码执行状态

        //判断num是否小于0,如果是,则抛出一个IllegalArgumentException异常。
        
        public void checkNumber(int num) {
          if (num < 0) {
            throw new IllegalArgumentException("Number must be positive");
          }
        }
        
      • throws 用于在方法中声明该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。

        //方法声明抛出 RemoteException 和 InsufficientFundsException
        
        import java.io.*;
        public class className
        {
           public void withdraw(double amount) throws RemoteException,
                                      InsufficientFundsException
           {
               // Method implementation
           }
           //Remainder of class definition
        }
        

finnally

  • finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

  • 语法为:

    try{
      // 程序代码
    }catch(异常类型1 异常的变量名1){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }finally{
      // 程序代码
    }
    
    public class ExcepTest{
      public static void main(String args[]){
        int a[] = new int[2];
        try{
           System.out.println("Access element three :" + a[3]);
        }catch(ArrayIndexOutOfBoundsException e){
           System.out.println("Exception thrown  :" + e);
        }
        finally{
           a[0] = 6;
           System.out.println("First element value: " +a[0]);
           System.out.println("The finally statement is executed");
        }
      }
    }
    
    /*输出为:
    Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
    First element value: 6
    The finally statement is executed
    */
    
posted @ 2024-01-01 22:30  初夏如霞  阅读(34)  评论(0)    收藏  举报