Skip to content

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 = 告诉别人我会扔出异常

基于 VitePress 构建