java异常如何处理
异常处理的基本概念
Java异常处理机制通过try-catch-finally块实现,用于捕获和处理程序运行时可能出现的错误。异常分为检查型异常(必须处理)和非检查型异常(运行时异常,可不处理)。
使用try-catch捕获异常
将可能抛出异常的代码放入try块,通过catch捕获特定异常类型:
try {
int result = 10 / 0; // 抛出ArithmeticException
} catch (ArithmeticException e) {
System.out.println("除零错误: " + e.getMessage());
}
多个catch块可处理不同类型的异常,子类异常需排在父类之前。
finally块的使用
无论是否发生异常,finally块中的代码都会执行,常用于资源清理:
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try { fis.close(); } catch (IOException e) { /* 处理关闭异常 */ }
}
}
自动资源管理(try-with-resources)
Java 7+支持自动关闭实现AutoCloseable接口的资源:
try (FileInputStream fis = new FileInputStream("file.txt")) {
// 使用资源
} catch (IOException e) {
e.printStackTrace();
}
抛出异常
通过throw主动抛出异常对象:
if (input < 0) {
throw new IllegalArgumentException("输入不能为负数");
}
声明异常
方法可能抛出检查型异常时,需在方法签名使用throws声明:
public void readFile() throws IOException {
// 可能抛出IO异常的代码
}
自定义异常
继承Exception或RuntimeException创建自定义异常:
public class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
异常处理最佳实践
- 避免空的catch块,至少记录异常信息
- 使用特定异常而非通用的
Exception - 优先使用Java内置异常类型
- 在业务逻辑层处理异常,而非UI层直接暴露
- 合理使用异常链(
cause参数)保持原始异常信息
异常性能考虑
频繁抛出异常会影响性能,对于可预见的错误条件(如用户输入验证),建议使用条件判断而非异常机制。







