异常:
异常(Exception)是程序运行时发生的错误或意外情况。
分类:
Checked Exceptions(受检异常)
这些异常在编译时检查,必须被捕获或声明抛出。通常是由外部因素引起的,如文件不存在、网络连接失败等。常见的受检异常包括 IOException、SQLException 等。
Unchecked Exceptions(非受检异常)
这些异常在运行时发生,通常是由程序逻辑错误引起的,如空指针、数组越界等。常见的非受检异常包括 NullPointerException、ArrayIndexOutOfBoundsException 等。
异常处理:
try-catch-finally 结构来处理异常:
- try 块:包含可能抛出异常的代码。
- catch 块:捕获并处理特定类型的异常。
- finally 块:无论是否发生异常,都会执行的代码块,通常用于释放资源。
try {
// 可能抛出异常的代码
int result = 10 / 0; // 这里会抛出 ArithmeticException
} catch (ArithmeticException e) {
// 捕获并处理 ArithmeticException
System.out.println("除零错误: " + e.getMessage());
} finally {
// 无论是否发生异常,都会执行
System.out.println("执行 finally 块");
}
抛出异常
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
自定义异常
开发者创建自定义异常类,通常继承自 Exception 或 RuntimeException:
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
// 使用自定义异常
try {
throw new MyCustomException("这是一个自定义异常");
} catch (MyCustomException e) {
System.out.println(e.getMessage());
}
异常链
Java 支持异常链,即一个异常可以包装另一个异常,保留原始异常的上下文信息:
try {
// 可能抛出异常的代码
} catch (IOException e) {
throw new MyCustomException("发生 IO 错误", e);
}
常见异常类型
- NullPointerException:尝试访问空对象的成员。
- ArrayIndexOutOfBoundsException:数组下标越界。
- ClassCastException:类型转换错误。
- IllegalArgumentException:传递给方法的参数不合法。
- IOException:输入输出操作失败。
实践:
- 捕获特定异常:避免捕获所有异常(catch (Exception e)),应捕获特定类型的异常。
- 避免空的 catch 块:空的 catch 块会隐藏错误,增加调试难度。
- 使用 finally 释放资源:确保资源(如文件、网络连接)在 finally 块中释放。
- 记录异常信息:使用日志记录异常信息,便于排查问题。
示例
import java.io.FileInputStream;
import java.io.IOException;
public class ExceptionExample {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream("nonexistent.txt");
int data = file.read();
file.close();
} catch (IOException e) {
System.out.println("文件读取错误: " + e.getMessage());
} finally {
System.out.println("执行 finally 块");
}
}
}

被折叠的 条评论
为什么被折叠?



