异常有哪些种类,可以举几个例子吗?
参考回答**
Java 中的异常大致可以分为两大类:
- 检查异常(Checked Exception):在编译时必须处理的异常,如通过
try-catch
或throws
声明。例如:IOException
:文件操作时可能出现的异常。SQLException
:数据库操作时可能出现的异常。
- 运行时异常(Unchecked Exception):在编译时不强制处理,通常是程序逻辑错误导致的。例如:
NullPointerException
:访问空引用时抛出。ArrayIndexOutOfBoundsException
:数组索引越界时抛出。
此外,还有一类特殊的异常:
- 错误(Error)
:表示程序无法恢复的严重错误,通常由 JVM 抛出。例如:
OutOfMemoryError
:内存不足时抛出。StackOverflowError
:递归调用过深导致栈溢出。
详细讲解与拓展
1. 异常的继承结构
Java 中异常类的继承关系如下:
java.lang.Throwable
├── java.lang.Exception
│ ├── 检查异常(Checked Exception)
│ └── 运行时异常(Unchecked Exception)
└── java.lang.Error
Throwable
是所有异常的根类,只有其子类(Exception
和Error
)可以被抛出或捕获。-
Exception
:
- 检查异常:直接继承
Exception
,需要显式处理。 - 运行时异常:继承
RuntimeException
,不需要显式处理。
- 检查异常:直接继承
Error
:表示程序的严重问题,不应该捕获或处理。
2. 检查异常(Checked Exception)
-
特点:编译时必须显式处理,否则程序无法通过编译。
-
常见例子:
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()); } } }
SQLException
:数据库操作失败时抛出。-
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)
- 特点:编译时不要求显式处理,但应在运行时通过逻辑避免。
-
常见例子:
NullPointerException
:尝试访问空引用时抛出。
public class Main { public static void main(String[] args) { String str = null; System.out.println(str.length()); // 抛出 NullPointerException } }
ArrayIndexOutOfBoundsException
:访问数组非法索引时抛出。public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 抛出 ArrayIndexOutOfBoundsException } }
ArithmeticException
:算术运算异常(如除以零)。public class Main { public static void main(String[] args) { int result = 10 / 0; // 抛出 ArithmeticException } }
4. 错误(Error)
- 特点:表示严重问题,通常是 JVM 层面的错误,开发者无法处理。
-
常见例子:
OutOfMemoryError
:堆内存不足时抛出。public class Main { public static void main(String[] args) { int[] arr = new int[Integer.MAX_VALUE]; // 抛出 OutOfMemoryError } }
StackOverflowError
:递归调用过深导致栈溢出。public class Main { public static void recursive() { recursive(); } public static void main(String[] args) { recursive(); // 抛出 StackOverflowError } }
5. 异常的处理
Java 提供了两种处理异常的方法:
- 捕获异常(try-catch块):
try { // 可能抛出异常的代码 } catch (Exception e) { // 异常处理代码 }
- 抛出异常(throws 关键字):
public void readFile() throws IOException { // 抛出异常,交由调用者处理 }
6. 检查异常 vs 运行时异常
特点 | 检查异常 | 运行时异常 |
---|---|---|
编译时处理 | 必须处理,否则编译失败 | 不强制处理 |
适用场景 | 程序外部问题(如文件、数据库) | 程序逻辑错误(如空指针) |
典型例子 | IOException 、SQLException |
NullPointerException 等 |