在 Java 中,throws 本身不是“抛出异常”,而是“声明可能抛出的异常”。很多人说“throws 抛出失败”,通常是以下几种常见原因。
throws 不会真正抛出异常public void test() throws Exception {
// 什么都没做
}
上面代码 只是声明 这个方法可能抛 Exception,但并没有真正抛出异常。
✅ 真正抛出要用 throw:
public void test() throws Exception {
throw new Exception("出错了");
}
⚠️ 区别:
throws:方法签名上声明throw:真正抛出异常对象public void read() {
new FileInputStream("a.txt"); // 编译错误
}
FileInputStream 会抛 IOException(受检异常),你必须:
✅ 方案 1:throws 声明
public void read() throws IOException {
new FileInputStream("a.txt");
}
✅ 方案 2:try-catch 处理
public void read() {
try {
new FileInputStream("a.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
throws 不能“跨层自动抛出”运行时异常public void a() {
b();
}
public void b() throws RuntimeException {
throw new RuntimeException();
}
✅ 运行时异常(RuntimeException)不需要 throws,也不强制捕获
❌ 很多人误以为 throws 能“强制传播”
catch 吞掉了public void test() throws Exception {
try {
throw new Exception("错误");
} catch (Exception e) {
// 什么都没做
}
}
✅ 异常被 catch 后就不会再向外抛
main 方法抛异常“看起来没生效”public static void main(String[] args) throws Exception {
throw new Exception("失败");
}
程序会直接终止,并打印异常栈:
Exception in thread "main" java.lang.Exception: 失败
这不是失败,而是 Java 的正常行为。
class A {
void test() throws IOException {}
}
class B extends A {
@Override
void test() throws Exception {} // ❌ 编译错误
}
✅ 子类只能:
throws 会中断程序,但其实没有throws 不会中断程序,只是把异常交给调用者处理。
throws只是“声明可能抛”,真正抛异常必须throw
如果你愿意,可以把具体代码贴出来,我可以帮你精确指出“为什么没抛成功”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。