在 Java 里,throws 只是声明“这个方法可能会抛出这些异常”,把处理责任交给调用者。用不好确实有不少坑,下面按常见踩坑点 + 示例 + 建议说。
坑:
public void read() throws IOException {
Files.readAllBytes(Path.of("a.txt"));
}
调用者必须继续 throws 或 try-catch,否则编译不过。
如果上层也不管,最后到 main / 线程,直接程序崩溃或日志丢失。
✅ 建议
throws坑:
public void doSomething() throws Exception {
}
调用者被迫 catch 所有异常,根本不知道会发生什么。
✅ 建议
throws Exception / throws Throwable坑:
class A {
void f() throws IOException {}
}
class B extends A {
@Override
void f() throws Exception {} // ❌ 编译错误
}
✅ 规则
坑:
public void test() throws NullPointerException {
}
NullPointerException 是 RuntimeException
➡ 写了也没约束作用,调用者不 catch 也能编译
✅ 建议
throws 一般只用于 checked exception坑:
public void f() throws Exception {
try {
risky();
} catch (IOException e) {
throw new Exception("error"); // 原异常没了
}
}
✅ 建议
throw new RuntimeException("error", e);
保留 cause,方便排查
坑: 接口声明:
interface Service {
void save() throws IOException;
}
后期实现可能根本不 IO,但接口改不了。
✅ 建议
坑:
@Transactional
public void f() throws RuntimeException {
}
事务是否回滚看是否抛到代理层,不是看 throws
✅ 建议
throws 就等于“会处理”
throws不是“解决异常”,只是“甩锅声明”。
坑主要在这:甩太远、甩太宽、甩错层、甩丢原因。
如果你愿意,可以贴一段你自己的代码,我可以直接帮你指出有哪些 throws 用法有问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。