必须加上throws声明。java编译器强制要求方法若throw受检异常且未捕获,就必须在方法签名中用throws显式声明,否则编译失败;受检异常指继承exception但非runtimeexception的类,如ioexception;throw抛实例,throws声明类型,二者常配合使用。

是的,必须加上。
Java 编译器强制要求:只要方法体内用 throw 抛出了一个受检异常(checked exception),而该异常又没有在方法内部用 try-catch 捕获处理,那么这个方法的签名就必须用 throws 显式声明该异常类型,否则编译直接失败。
这是因为受检异常属于编译期检查项,目的是让调用方提前知晓并主动应对潜在错误。
关键点如下:
- 受检异常是指继承自
Exception但不继承自RuntimeException的类,比如IOException、SQLException、自定义的BusinessException extends Exception。 -
throw是抛出一个异常实例(如throw new IOException("...");),它发生在方法体中; -
throws是声明该方法可能抛出的异常类型(如throws IOException, BusinessException),它写在方法签名末尾,紧接参数列表右括号之后。 - 二者常配合使用:你
throw了受检异常,就得throws它;不throws,编译器会报错,提示类似unreported exception XXX; must be caught or declared to be thrown。
常见情况举例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
✅ 正确:
public void saveOrder(Order order) throws BusinessException { if (order == null) { throw new BusinessException("订单不能为空"); } } -
❌ 错误(编译不通过):
public void saveOrder(Order order) { // 缺少 throws throw new BusinessException("订单不能为空"); // BusinessEx 是受检异常 } ⚠️ 注意:如果抛出的是
RuntimeException或其子类(如IllegalArgumentException、NullPointerException),则throws声明是可选的,加或不加都不影响编译。
补充说明:
- 一个方法可以
throws多个受检异常,用英文逗号分隔,如throws IOException, SQLException; - 若已声明父类异常(如
Exception),就不能再重复声明其子类(如IOException),否则编译报错; - 调用该方法的代码,要么用
try-catch捕获这些异常,要么在自己的方法签名中继续throws,形成异常传递链。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










