Java 中 throw 和 throws 详解课件
一、课程信息
学习目标
- 清晰区分 throw 和 throws 的作用。
- 掌握 throw 语句手动抛出异常的方法。
- 学会使用 throws 声明方法可能抛出的异常。
- 能够在实际编程中正确运用 throw 和 throws 处理异常。
二、课程导入
生活场景引入
- 想象你是一名厨师,在做菜过程中发现食材变质了。你有两个选择:一是自己处理,比如扔掉变质食材并重新准备;二是把这个问题告知餐厅经理,让经理来处理。在 Java 里,throw 就像是厨师自己发现问题并抛出问题,而 throws 则如同厨师告知经理这个问题可能会出现。
- 提问学生生活中类似的问题传递场景,引导他们思考在编程里如何处理异常情况。
三、异常处理基础回顾
异常定义
异常是程序运行过程中出现的不正常情况,会干扰程序的正常执行流程。
异常分类
- 受检查异常(Checked Exception):编译器会检查这类异常,要求程序必须处理,如
IOException
。 - 运行时异常(Runtime Exception):编译器不会强制要求处理,如
NullPointerException
。
异常处理机制
try-catch
块:用于捕获和处理异常。finally
块:无论是否发生异常,其中的代码都会执行,常用于资源释放。
示例代码:
public class ExceptionReview {
public static void main(String[] args) {
try {
int result = 10 / 0; // 会抛出 ArithmeticException
} catch (ArithmeticException e) {
System.out.println("捕获到算术异常:" + e.getMessage());
} finally {
System.out.println("finally 块执行");
}
}
}
四、throw 关键字详解
定义
throw 用于在方法内部手动抛出一个异常对象。
语法
throw new ExceptionType("异常信息");
示例代码
public class ThrowExample {
public static void checkAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
System.out.println("年龄合法:" + age);
}
public static void main(String[] args) {
try {
checkAge(-5);
} catch (IllegalArgumentException e) {
System.out.println("捕获到异常:" + e.getMessage());
}
}
}
代码解释
- 在
checkAge
方法中,当传入的年龄为负数时,使用 throw 手动抛出一个IllegalArgumentException
异常。 - 在
main
方法中,使用try-catch
块捕获并处理该异常。
注意事项
- throw 后面必须跟一个异常对象。
- 抛出异常后,程序会立即停止当前方法的执行,跳转到相应的异常处理代码处。
五、throws 关键字详解
定义
throws 用于在方法声明中指定该方法可能抛出的异常类型。
语法
public void methodName() throws ExceptionType1, ExceptionType2 {
// 方法体
}
示例代码
import java.io.FileReader;
import java.io.IOException;
public class ThrowsExample {
public static void readFile() throws IOException {
FileReader reader = new FileReader("nonexistent.txt");
// 读取文件操作
reader.close();
}
public static void main(String[] args) {
try {
readFile();
} catch (IOException e) {
System.out.println("捕获到文件读取异常:" + e.getMessage());
}
}
}
代码解释
readFile
方法使用 throws 声明可能会抛出IOException
。- 在
main
方法中调用readFile
方法时,需要使用try-catch
块捕获并处理该异常。
注意事项
- throws 后面可以跟多个异常类型,用逗号分隔。
- 当方法抛出受检查异常时,调用该方法的代码必须处理这些异常,要么使用
try-catch
块捕获,要么继续使用 throws 声明抛出。
六、throw 和 throws 的综合应用
示例代码
import java.io.FileReader;
import java.io.IOException;
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public class CombinedExample {
public static void processFile() throws CustomException {
try {
FileReader reader = new FileReader("nonexistent.txt");
// 模拟文件处理
if (Math.random() < 0.5) {
throw new CustomException("文件处理过程中出现自定义异常");
}
reader.close();
} catch (IOException e) {
throw new CustomException("文件读取异常:" + e.getMessage());
}
}
public static void main(String[] args) {
try {
processFile();
} catch (CustomException e) {
System.out.println("捕获到自定义异常:" + e.getMessage());
}
}
}
代码解释
- 定义了一个自定义异常
CustomException
。 processFile
方法使用 throws 声明可能会抛出CustomException
。- 在
processFile
方法内部,使用 throw 手动抛出CustomException
,既可以在满足特定条件时抛出,也可以在捕获到其他异常后包装成自定义异常抛出。
实际应用场景
- 数据验证:在数据输入时,使用 throw 抛出异常提示数据不合法。
- 资源操作:在文件读取、网络连接等操作中,使用 throws 声明可能出现的异常。
七、课堂练习
练习一
编写一个方法 divide
,用于计算两个整数的商。如果除数为 0,使用 throw 抛出 ArithmeticException
。
练习二
编写一个方法 openFile
,用于打开指定文件。使用 throws 声明可能会抛出的 IOException
,并在 main
方法中调用该方法并处理异常。
八、课程总结
知识回顾
- throw 用于手动抛出异常,在方法内部使用。
- throws 用于声明方法可能抛出的异常,在方法声明处使用。
常见问题解答
- 解答学生在课堂练习和学习过程中遇到的问题。
口诀总结
- “throw 抛出异常忙,方法里面显锋芒。throws 声明在前方,调用之处要妥当。异常处理不慌张,程序稳定有保障。”
九、课后作业
作业一
编写一个方法 registerUser
,用于用户注册。如果用户名已存在,使用 throw 抛出 IllegalArgumentException
;如果密码长度小于 6 位,也抛出该异常。
作业二
分析一个已有的 Java 项目,找出其中使用 throw 和 throws 的地方,并说明其作用和处理方式。