第一部分:异常基础
理解异常的概念和 Java 中的异常体系
学习目标
了解异常的分类,掌握 try-catch-finally 的基本用法
1
异常的分类
Java 中的异常分为两大类:
- 检查型异常:编译器强制要求处理的异常,如 IOException
- 非检查型异常:运行时异常,如 NullPointerException
// 检查型异常示例
public void readFile(String filename) throws IOException {
FileReader file = new FileReader(filename);
// 文件操作...
}
2
try-catch-finally
基本的异常处理结构
try {
// 可能抛出异常的代码
} catch (IOException e) {
// 捕获并处理异常
e.printStackTrace();
} finally {
// 无论是否捕获异常都会执行
}
第二部分:throws 关键字
声明方法可能抛出的异常
1
基本语法
public void someMethod() throws ExceptionType1, ExceptionType2 {
// 方法实现
}
2
使用示例
public void writeToFile(String filename, String data) throws IOException {
FileWriter writer = new FileWriter(filename);
writer.write(data);
writer.close();
}
第三部分:throw 关键字
主动抛出异常
1
基本语法
throw new ExceptionType("异常信息");
2
使用示例
public void validateAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
}
第四部分:自定义异常
创建自己的异常类
1
自定义异常类
public class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
2
使用自定义异常
public void checkCondition(int value) throws MyCustomException {
if (value < 0) {
throw new MyCustomException("值不能为负数");
}
}
第五部分:常见错误与最佳实践
避免开发中的常见陷阱
错误1:抛出非异常对象
throw "这不是一个异常"; // 编译错误
throw 后面必须是异常对象
错误2:未捕获或声明异常
public void method() {
throw new IOException(); // 编译错误
}
检查型异常必须捕获或声明
错误3:异常链错误
try {
throw new IOException();
} catch (IOException e) {
throw e; // 正确
}
重新抛出异常时,确保异常类型匹配
最佳实践总结
- 明确异常类型:抛出异常时,选择合适的异常类型
- 提供清晰信息:异常消息应明确、具体
- 避免过度捕获:仅捕获需要处理的异常
- 使用 finally:确保资源正确释放
- 文档说明:在方法注释中说明可能抛出的异常
第六部分:完整实战案例
通过用户注册系统演示异常处理的实际应用
1
用户注册接口
public interface UserRegistration {
void register(String username, String password) throws RegistrationException;
}
2
自定义异常类
public class RegistrationException extends Exception {
public RegistrationException(String message) {
super(message);
}
}
3
实现用户注册
public class SimpleUserRegistration implements UserRegistration {
@Override
public void register(String username, String password) throws RegistrationException {
if (username == null || username.isEmpty()) {
throw new RegistrationException("用户名不能为空");
}
if (password == null || password.length() < 6) {
throw new RegistrationException("密码至少需要6位");
}
// 注册逻辑...
System.out.println("用户注册成功");
}
}
4
使用测试
public class RegistrationTest {
public static void main(String[] args) {
UserRegistration registration = new SimpleUserRegistration();
try {
registration.register("john_doe", "password123");
} catch (RegistrationException e) {
System.out.println("注册失败: " + e.getMessage());
}
}
}
第七部分:总结与进阶
一张图掌握所有核心知识点
throws 关键字
- 声明方法可能抛出的异常
- 调用者必须处理或声明这些异常
throw 关键字
- 主动抛出异常
- 可以抛出内置异常或自定义异常
自定义异常
- 继承 Exception 或 RuntimeException
- 提供构造方法和异常信息
综合练习任务
- 创建一个自定义异常类 `InvalidInputException`
- 在方法中使用 `throw` 抛出自定义异常
- 在调用方法时使用 `try-catch` 捕获异常
- 处理可能出现的异常并记录日志
- 添加完整的单元测试
记忆口诀
"throws 声明异常,throw 抛出异常;自定义异常继承 Exception"