异常有哪些种类,可以举几个例子吗?

参考回答**

Java 中的异常大致可以分为两大类:

  1. 检查异常(Checked Exception):在编译时必须处理的异常,如通过 try-catchthrows 声明。例如:
    • IOException:文件操作时可能出现的异常。
    • SQLException:数据库操作时可能出现的异常。
  2. 运行时异常(Unchecked Exception):在编译时不强制处理,通常是程序逻辑错误导致的。例如:
    • NullPointerException:访问空引用时抛出。
    • ArrayIndexOutOfBoundsException:数组索引越界时抛出。

此外,还有一类特殊的异常:

  • 错误(Error)

    :表示程序无法恢复的严重错误,通常由 JVM 抛出。例如:

    • OutOfMemoryError:内存不足时抛出。
    • StackOverflowError:递归调用过深导致栈溢出。

详细讲解与拓展

1. 异常的继承结构

Java 中异常类的继承关系如下:

java.lang.Throwable
├── java.lang.Exception
│   ├── 检查异常(Checked Exception)
│   └── 运行时异常(Unchecked Exception)
└── java.lang.Error
  • Throwable 是所有异常的根类,只有其子类(ExceptionError)可以被抛出或捕获。

  • Exception

    • 检查异常:直接继承 Exception,需要显式处理。
    • 运行时异常:继承 RuntimeException,不需要显式处理。
  • Error:表示程序的严重问题,不应该捕获或处理。


2. 检查异常(Checked Exception)

  • 特点:编译时必须显式处理,否则程序无法通过编译。

  • 常见例子:

    1. IOException

      :文件或流操作失败时抛出。

      import java.io.File;
      import java.io.FileReader;
      
      public class Main {
       public static void main(String[] args) {
           try {
               File file = new File("test.txt");
               FileReader reader = new FileReader(file);
           } catch (IOException e) {
               System.out.println("文件操作失败: " + e.getMessage());
           }
       }
      }
      
    2. SQLException:数据库操作失败时抛出。

    3. ClassNotFoundException

      :加载一个不存在的类时抛出。

      public class Main {
       public static void main(String[] args) {
           try {
               Class.forName("com.mysql.jdbc.Driver");
           } catch (ClassNotFoundException e) {
               System.out.println("类未找到: " + e.getMessage());
           }
       }
      }
      

3. 运行时异常(Unchecked Exception)

  • 特点:编译时不要求显式处理,但应在运行时通过逻辑避免。

  • 常见例子:

    1. NullPointerException

      :尝试访问空引用时抛出。

      public class Main {
       public static void main(String[] args) {
           String str = null;
           System.out.println(str.length()); // 抛出 NullPointerException
       }
      }
      
    2. ArrayIndexOutOfBoundsException:访问数组非法索引时抛出。
      public class Main {
       public static void main(String[] args) {
           int[] arr = {1, 2, 3};
           System.out.println(arr[3]); // 抛出 ArrayIndexOutOfBoundsException
       }
      }
      
    3. ArithmeticException:算术运算异常(如除以零)。
      public class Main {
       public static void main(String[] args) {
           int result = 10 / 0; // 抛出 ArithmeticException
       }
      }
      

4. 错误(Error)

  • 特点:表示严重问题,通常是 JVM 层面的错误,开发者无法处理。

  • 常见例子:

    1. OutOfMemoryError:堆内存不足时抛出。
      public class Main {
       public static void main(String[] args) {
           int[] arr = new int[Integer.MAX_VALUE]; // 抛出 OutOfMemoryError
       }
      }
      
    2. StackOverflowError:递归调用过深导致栈溢出。
      public class Main {
       public static void recursive() {
           recursive();
       }
       public static void main(String[] args) {
           recursive(); // 抛出 StackOverflowError
       }
      }
      

5. 异常的处理

Java 提供了两种处理异常的方法:

  1. 捕获异常(try-catch块):
    try {
       // 可能抛出异常的代码
    } catch (Exception e) {
       // 异常处理代码
    }
    
  2. 抛出异常(throws 关键字):
    public void readFile() throws IOException {
       // 抛出异常,交由调用者处理
    }
    

6. 检查异常 vs 运行时异常

特点 检查异常 运行时异常
编译时处理 必须处理,否则编译失败 不强制处理
适用场景 程序外部问题(如文件、数据库) 程序逻辑错误(如空指针)
典型例子 IOExceptionSQLException NullPointerException

发表回复

后才能评论