Exception与Throwable

本文探讨了一种奇怪的现象:在Java中,特定的异常抛出方式导致一部分异常无法被捕获。通过对比不同捕获类型的差异,揭示了Throwable与Exception在异常处理上的细微差别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个奇怪的问题

定义了一个异常类,ServiceException,继承java.Long.Exception的

但是呢

代码里面

try{

    code1(  throw new ServiceException("1111111111111")  );

    code2(  throw new ServiceException("2222222222222")  );

}catch(Exception e){


}

但是呢,代码走到code1的时候,异常也throw了,居然没有捕获到,code2捕获到了

换成

try{

    code1(  throw new ServiceException("1111111111111")  );

    code2(  throw new ServiceException("2222222222222")  );

}catch(Throwable e){


}

就能捕获到code1了,code2不执行,这是为什么呢???

ServiceException继承了Exception啊,exception是throwable的子类,

但是,为什么exception捕获不到第一个呢????

难道不捕获?

还是直到代码走完了才捕获?在这不科学吧

throwable就是立即捕获??


### Java 中 `try-catch` 处理 `Exception` `Throwable` 在 Java 中,异常处理机制允许程序捕获并响应错误条件。主要的异常类有两个层次结构:`Error` 类 `Exception` 类,两者都是 `Throwable` 的子类。 #### 使用 `Exception` 当仅捕捉 `Exception` 及其子类时,通常用于处理可以预见的应用逻辑中的问题: ```java public class Example { public static void main(String[] args) { try { int result = divide(10, 0); } catch (ArithmeticException e) { System.out.println("Caught Arithmetic Exception"); } } private static int divide(int a, int b) throws ArithmeticException { if (b == 0) throw new ArithmeticException("Division by zero!"); return a / b; } } ``` 此代码片段展示了如何专门针对特定类型的异常进行处理[^1]。 #### 使用 `Throwable` 相比之下,捕捉 `Throwable` 则更为广泛,不仅涵盖了所有的运行时异常 (`RuntimeException`) 受检异常 (`Checked Exception`),还包括了严重错误 (`Error`) 如虚拟机内部错误或资源不足等问题: ```java public class ErrorHandlingExample { public static void main(String[] args) { try { // Simulate an error condition Thread.dumpStack(); } catch (Throwable t) { System.err.println("An unexpected throwable occurred."); t.printStackTrace(System.err); } } } ``` 这段代码能够捕获任何可能发生的致命错误,并打印堆栈跟踪信息以便调试。 值得注意的是,在大多数情况下推荐只捕获具体的异常而不是泛化至 `Throwable` 或者甚至更宽泛的 `Exception`,因为这可能会隐藏真正应该被注意到的重要问题。对于不可恢复的情况应当让它们终止应用程序而非试图继续执行下去[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值