throws用于在方法签名中声明可能抛出但不处理的受检异常,必须在未捕获ioexception等受检异常时使用,可声明多个异常,重写时不得扩大异常范围,区别于throw语句。

throws 用于在方法声明中告诉调用者:这个方法执行过程中可能会抛出某些异常,但不自己处理,而是交给上层调用者来处理。
什么时候必须用 throws
当方法内部调用了可能抛出受检异常(checked exception)的代码,又没用 try-catch 捕获时,编译器会强制要求你用 throws 声明这些异常。比如操作文件、网络请求、解析日期等场景。
- IOException、SQLException、ParseException 等都属于受检异常,不声明或不捕获就编译不过
- RuntimeException 及其子类(如 NullPointerException、IllegalArgumentException)是不受检的,throws 不是必须的,但可以写,用于文档说明
基本写法和语法格式
在方法参数列表后、方法体前,用 throws + 异常类名,多个异常用逗号分隔:
- 可以声明一个异常,也可以多个;顺序无关,但建议按继承关系从具体到宽泛(如先 FileNotFoundException 再 IOException)
- 声明的异常必须是实际可能抛出的类型,或其父类(但不能是无关类型)
- 子类重写父类方法时,throws 的异常不能比父类声明的范围更宽(即不能新增受检异常)
和 try-catch 的配合关系
throws 不等于“处理”异常,只是“甩锅”。真正处理还得靠调用方:
- 调用方可以选择用 try-catch 捕获并处理这些异常
- 调用方也可以继续用 throws 往上传,直到某个层级真正处理,或者由 JVM 默认终止程序
- 如果调用链顶端(如 main 方法)也没处理,且是受检异常,编译直接报错
常见误区提醒
别把 throws 当成万能解药,也别滥用:
- 不要只为“让编译通过”而 throws RuntimeException,这掩盖了本可预防的逻辑问题
- 不要在每个方法都无差别 throws Exception,会失去异常语义,让调用方无法针对性处理
- 自定义异常时,如果是受检的,调用它的地方同样要面对 throws 或 try-catch 的选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











