Throw 和 Throws
throw 和 throws 长得像,但完全不是一回事。搞混了,编译器会教你做人。
区别
| 关键字 | 用法 | 说明 |
|---|---|---|
| throw | 方法内 | 抛出具体异常 |
| throws | 方法签名 | 声明可能抛出的异常 |
throw 抛出
java
public class ThrowDemo {
public static void main(String[] args) {
// 抛出运行时异常
throw new NullPointerException("对象不能为 null");
// 抛出受检异常需要声明
// throw new IOException("文件不存在"); // 编译错误
}
}throws 声明
java
import java.io.*;
public class ThrowsDemo {
// 声明可能抛出的异常
public static void readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
BufferedReader br = new BufferedReader(reader);
System.out.println(br.readLine());
br.close();
}
public static void main(String[] args) {
try {
readFile("test.txt");
} catch (IOException e) {
System.out.println("读取失败: " + e.getMessage());
}
}
}异常传播
未捕获的异常会沿着调用栈向上传播,一层一层往外抛,直到有人处理或者到达 JVM:
java
public class ExceptionPropagationDemo {
// 方法A不处理,抛给调用者
static void methodA() throws Exception {
methodB();
}
static void methodB() throws Exception {
// 继续传播
throw new Exception("发生了错误");
}
public static void main(String[] args) {
try {
methodA();
} catch (Exception e) {
System.out.println("捕获: " + e.getMessage());
}
}
}多异常声明
java
import java.io.*;
public class MultiExceptionDemo {
// 声明多个异常
public static void process() throws IOException, SQLException {
// 可能抛出多种异常
}
public static void main(String[] args) {
try {
process();
} catch (IOException | SQLException e) {
// JDK 7+ 同一 catch 处理多个异常
System.out.println("异常: " + e.getMessage());
}
}
}记住这两个词
throw = 把异常扔出去
throws = 告诉别人我会扔出异常
