You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

何时需在Java方法签名中使用throws关键字?

关于Java中throws关键字的疑问与解答

我完全懂你的困惑——为啥在otherMethod()里去掉throws InputMismatchException之后,代码依然能正常捕获异常?这得从Java异常的分类和throws的核心作用说起。

首先,Java里的异常分两类:

  • 检查型异常(Checked Exception):这类异常是编译器强制要求处理的,比如IOException、SQLException。如果方法里抛出了这类异常,要么用try-catch在内部处理,要么必须用throws声明让上层调用者处理,否则编译直接报错。
  • 非检查型异常(Unchecked Exception):也就是RuntimeException及其子类,比如你用到的InputMismatchException、NullPointerException、ArrayIndexOutOfBoundsException都属于这类。编译器不会强制要求你声明或者处理这类异常,JVM会自动把它们向上传递给调用栈的上层方法。

回到你的例子:InputMismatchException是RuntimeException的子类,属于非检查型异常。所以哪怕你不在otherMethod()的签名里写throws InputMismatchException,当异常发生时,JVM也会自动把它抛给调用它的main方法,main里的try-catch自然能捕获到。这就是为啥你去掉throws后代码依然正常运行的原因。

那throws关键字到底有啥用?什么时候必须用?

  • 必须用的场景:处理检查型异常
    当你的方法中抛出了检查型异常,又不想在方法内部用try-catch处理,那必须在方法签名里用throws声明这个异常,告诉调用者“我这个方法可能会抛出XX异常,你得处理一下”。比如下面这个文件读取的例子,如果去掉throws IOException,编译器直接报错:
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileExample {
        // 必须声明throws IOException,因为FileReader构造方法会抛出检查型异常
        public static void readFile() throws IOException {
            FileReader reader = new FileReader("test.txt");
            // 读取操作...
        }
    
        public static void main(String[] args) {
            try {
                readFile();
            } catch (IOException e) {
                System.out.println("文件读取出错:" + e.getMessage());
            }
        }
    }
    
  • 可选但推荐的场景:明确提示非检查型异常
    对于非检查型异常,throws不是必须的,但加上它可以作为一种“代码文档”,明确告诉调用者这个方法可能会抛出哪些异常,提升代码的可读性和可维护性。比如你原来的代码里加上throws InputMismatchException,其他开发者一看就知道这个方法可能因为输入不匹配抛出异常,不用去啃方法内部的实现。
  • 传递异常给上层处理
    当方法本身不适合处理某个异常(比如业务层不想处理数据库异常,想交给上层的控制层处理),就可以用throws把异常抛给上层调用者,让更合适的层级来处理。

总结一下:throws的核心职责是应对编译器对检查型异常的强制要求,同时可以作为方法的异常提示文档。非检查型异常不需要强制声明,所以你的例子里去掉它不影响运行,但加上它能让代码更清晰。

内容的提问来源于stack exchange,提问作者Mikkel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:59