首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新抛出Throwable?

如何重新抛出Throwable?
EN

Stack Overflow用户
提问于 2021-03-24 13:22:35
回答 2查看 168关注 0票数 0

考虑下面的代码:

代码语言:javascript
复制
@Test(expected = NullPointerException.class)
public void testSaveEmptyApplication() {
    try {
        Application application = new Application();
        Application result = applicationService.save(application);
    } catch (Exception e) {
        if(e instanceof UncheckedServiceException) {
            throw e.getCause(); // java.lang.Throwable, compiler error
        }
    }
}

如何重新抛出Throwable?

EN

回答 2

Stack Overflow用户

发布于 2021-03-24 13:57:52

问题是testSaveEmptyApplication没有声明为抛出任何检查过的异常。但是e.getCause()返回Throwable,这是一个检查过的异常。因此,您在示例代码中所做的事情违反了Java的检查异常规则。

如果您知道原因确实是RuntimeException,那么您可以这样做

代码语言:javascript
复制
throw (RuntimeException) e.getCause();

注意事项:

  • 但是,如果您的假设是不正确的,并且原因异常的实际类是已检查的异常,则上面的结果将导致(全新的) ClassCastException,它会挤压您试图重新抛出的原因异常。

如果原因是Error,上面的代码也会中断,但你可以处理它;例如,像这样。

可抛出的原因= e.getCause();如果(RuntimeException的原因实例){ throw (RuntimeException)原因;} else if (实例错误的原因){抛出(错误)原因;} else {抛出新的AssertionError(“意外异常类”,原因);}

  • 如果您希望能够重新抛出检查过的异常,则必须在方法签名中声明它们。一旦你这样做了,你就可以按照上面的模式区分并抛出它们。

这一切都有点麻烦。但这是您首先为包装异常而付出的代价。

票数 2
EN

Stack Overflow用户

发布于 2021-03-24 13:29:40

我能想到的一个解决方案是:

catch子句为:

代码语言:javascript
复制
try {
  // ...
} catch (Exception e) {
    if(e instanceof UncheckedServiceException) {
        if(e.getCause() instanceof NullPointerException) {
            throw new NullPointerException(e.getCause().getMessage());
       }
    }
}

否则,更改方法签名,如下所示:

代码语言:javascript
复制
public void method() throws Throwable {
 // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66775187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档