在 Java 里,throws 不是“必须”的,但是在某些情况下是“必要”的。要不要写 throws,取决于你方法里会不会抛出“受检异常(checked exception)”。
下面分情况说清楚。
throws 是“必要”的(必须写)如果方法内部 直接抛出 或 调用了会抛受检异常的方法,且你 不 catch,就必须用 throws 声明。
public void readFile() throws IOException {
FileReader reader = new FileReader("a.txt"); // IOException 是受检异常
}
如果不写 throws IOException,编译直接报错。
✅ 这里 throws 是“必要”的
你不处理异常,而是交给调用者处理:
public void a() throws IOException {
b();
}
public void b() throws IOException {
// 可能抛 IOException
}
✅ 这是 throws 的典型用途
throws 不是必要的public void test() {
throw new RuntimeException("error");
}
✅ 不需要 throws
✅ 编译器不强制
public void test() {
try {
new FileReader("a.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
✅ 不需要 throws
throws 的作用是什么?throws 的本质是:
告诉编译器:这个方法“可能”抛出某种异常,调用者要负责处理
它 不会真的抛异常,只是“声明”。
throws 会抛出异常不是,throw 才抛异常。
throw new Exception(); // 真正抛
throws Exception; // 只是声明
只有 Checked Exception 需要。
| 异常类型 | 是否必须 throws |
|---|---|
| IOException | ✅ 必须 |
| SQLException | ✅ 必须 |
| RuntimeException | ❌ 不需要 |
| NullPointerException | ❌ 不需要 |
✅ 该 throws 就 throws(尤其是底层 API)
✅ 业务层尽量 catch + 转成自定义异常
✅ 不要无脑 throws Exception
public void service() throws BusinessException {
try {
dao.query();
} catch (SQLException e) {
throw new BusinessException("查询失败", e);
}
}
throws不是语法上“必须写”,但在抛出受检异常且不处理时,是“必要”的。
如果你愿意,我可以:
throw vs throws免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。