第一部分:异常基础

理解异常的概念和 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
  • 提供构造方法和异常信息

综合练习任务

  1. 创建一个自定义异常类 `InvalidInputException`
  2. 在方法中使用 `throw` 抛出自定义异常
  3. 在调用方法时使用 `try-catch` 捕获异常
  4. 处理可能出现的异常并记录日志
  5. 添加完整的单元测试

记忆口诀

"throws 声明异常,throw 抛出异常;自定义异常继承 Exception"