一、为什么需要异常处理?
在程序运行中,硬件故障、用户输入错误、软件bug等都会导致程序崩溃。异常处理的核心价值是:
– 让错误处理和正常业务逻辑分离,代码更清晰易维护
– 防止程序直接崩溃,能给出友好提示或体面退出
– 集中处理错误,避免传统编程中大量的 if-else 错误判断导致逻辑混乱
二、异常的基础概念
1. 什么是异常?
异常(Exception)是程序运行中发生的非正常事件,比如:
– 文件不存在( FileNotFoundException )
– 数组下标越界( ArrayIndexOutOfBoundsException )
– 空指针访问( NullPointerException )
– 类型转换错误( ClassCastException )
2. Java异常类的层次结构
所有异常都继承自 Throwable ,它有两个核心分支:
类名 特点 示例
Error 系统级错误,程序无法处理,如JVM崩溃、硬件故障 VirtualMachineError 、 ThreadDeath
Exception 程序级错误,可通过代码处理 分为RuntimeException和CheckedException
RuntimeException 运行时异常,编译器不强制处理,多为逻辑错误 NullPointerException 、 ArrayIndexOutOfBoundsException
CheckedException 编译时异常,编译器强制要求捕获或声明抛出 IOException 、 FileNotFoundException
三、Java的异常处理机制
Java提供了两种核心处理方式:捕获异常 和 声明抛出异常
1. 捕获异常: try-catch-finally
语法结构
try {
// 可能抛出异常的代码
} catch (异常类型1 e) {
// 处理异常类型1
} catch (异常类型2 e) {
// 处理异常类型2
} finally {
// 无论是否发生异常,都会执行的代码(如资源关闭)
}
关键要点
– try :标记可能出错的代码块
– catch :捕获并处理对应类型的异常,必须先捕获子类异常,再捕获父类异常(否则会出现 Unreachable catch block 错误)
– finally :主要用于释放资源(如文件流、数据库连接),确保资源一定被回收
2. 声明抛出异常: throws
如果方法无法处理异常,可以在方法声明中用 throws 声明抛出异常,交给调用者处理。
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("test.txt");
// …
}
– 一个方法可以声明抛出多个异常,用逗号分隔
– main 方法声明的异常会直接交给JVM处理,程序会终止
3. 主动抛出异常: throw
程序中可以手动创建并抛出异常对象,用于处理自定义错误场景:
if (numBoxes < 0) {
throw new NegativeNumberException(); // 抛出自定义异常
}
四、自定义异常类
当Java内置的异常无法满足业务需求时,可以自定义异常类,步骤如下:
1. 继承 Exception (或其子类,如 RuntimeException )
2. 编写构造方法(至少包含无参和带String参数的构造)
教材示例:自定义负数异常
class NegativeNumberException extends Exception {
public NegativeNumberException() {
super();
}
public NegativeNumberException(String message) {
super(message);
}
}
使用时通过 throw new NegativeNumberException() 抛出,再用 catch 捕获处理。
五、核心对比:传统错误处理 vs 异常处理
对比维度 传统编程技术 异常处理技术
代码结构 大量嵌套 if-else ,业务逻辑和错误处理混在一起 正常逻辑和错误处理分离,代码更清晰
维护性 错误处理代码分散,难以修改和扩展 集中处理异常,新增错误类型只需添加 catch 块
可读性 正常业务逻辑被错误判断打断,难以阅读 核心业务逻辑连贯,错误处理集中在 catch 块
六、关键工具:日志类 java.util.logging.Logger
Java自带的日志系统的核心用法:
1. 获取 Logger 实例: Logger logger = Logger.getLogger("包名.类名");
2. 配置日志处理器: FileHandler 将日志写入文件, SimpleFormatter 格式化日志
3. 记录不同级别的日志:
– logger.severe() :严重错误
– logger.warning() :警告信息
– logger.info() :普通信息
4. 日志级别优先级: SEVERE > WARNING > INFO > CONFIG > FINE > FINER > FINEST ,设置级别后,高于等于该级别的日志才会输出



