当前位置: 首页 > 知识库问答 >
问题:

在Java中抛出多个已检查异常有什么错?

须景胜
2023-03-14

考虑下面的java代码片段:

public <T> T create(Class<T> clazz) throws InstantiationException, IllegalAccessException {
    return clazz.newInstance();
}

这在Eclipse(Neon.2,JDK 8)中实现,Sonarint执行静态代码分析。它提供了重构的建议:

重构此方法以引发最多一个已检查异常,而不是:java。lang.InstanceionException,java。lang.IllegalAccessException

这项建议的基础是什么最佳做法?我知道一般来说对检查异常有一些争议,但是为什么在这种情况下,在这里捕获一个异常并将另一个异常传递到堆栈上比将它们都传递到堆栈上让其他东西来处理它们更好呢?

共有3个答案

许焕
2023-03-14
public class IllegalAccessException
extends ReflectiveOperationException

当应用程序试图反射性地创建实例(数组除外)、设置或获取字段或调用方法,但当前执行的方法无权访问指定类、字段的定义时,会引发IllegalAccessExc0019方法或构造函数。

司寇祖鹤
2023-03-14

我同意@David的观点,它是基于观点的,尽管在我看来,从基于单一责任原则的方法中抛出一个例外是最佳实践。当抛出多个异常时,听起来该方法是为了执行多个任务而实现的,这在理想情况下不是一个好的实践,尽管我们每个人都经常这样做。当有这样的需求时,最好通过使用适当的错误代码或错误消息提及问题来抛出自定义异常

爱刚捷
2023-03-14

这项建议的基础是什么最佳做法?

“最佳做法”意味着对这个问题有一个客观正确的答案。没有一个。

为什么在这种情况下,在这里捕获一个并将另一个传递到堆栈上会更好,而不是将它们都传递到堆栈上让其他东西来处理它们?

在这种情况下,你不会这么做。IllegalAccessExceptionInstantiationException都是ReflectiveOperationException的子类型。如果您想将签名减少为单个已检查异常(如检查器所建议的),您将使用该异常。

通常,统一(通过选择现有超类或重新设计异常层次结构)的理由是调用方需要处理更少的异常。

但是相反的论点是,当您统一抛出列表时,您正在向程序员/编译器隐藏信息。例如,如果API更改为:

public <T> T create(Class<T> clazz) throws ReflectiveOperationException {
    ...
}

使用该API的程序员不再知道可以抛出哪种类型的反射操作异常。当您通过捕获、包装和抛出作为新的异常来“统一”时,情况就更糟了。

请注意,我并不是说这两种方法都是错误的。我要说的是,环境应该决定你采取哪种方法。换句话说,诉诸“最佳实践”没有抓住要点。

 类似资料:
  • 在我正在进行的一个项目中,我发现了一个类,它在一些复杂的异常处理中包装了它的超类的所有方法。看起来和那个差不多: 我立即想到:“哇,怎么会有一个泛型包装器,然后在每个方法中调用它呢?这个类会短10倍!”。所以我得工作了。 如何获得一个函数接口来处理多个泛型异常?

  • 根据JCIP第6.3.2节: Runnable是一个相当有限的抽象;run无法返回值或引发选中的异常。 无法返回值,因为其返回类型为void,但为什么不能引发选中的异常?

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。

  • 我需要从java调用scala代码,因此需要告诉编译器某个方法抛出某些异常。对于一个异常很容易做到这一点,但是我很难声明一个方法抛出多个异常。 这不起作用:

  • 如何从Java 8流/lambda内部抛出检查异常? 换句话说,我想让像这样的代码编译: 此代码未编译,因为上面的方法抛出了,而该方法已被选中。 请注意,我不想在运行时异常中包装已检查的异常,而抛出包装的未检查的异常。我想抛出检查的异常本身,并且不向流中添加丑陋的/。

  • 问题内容: 包含多个有关将检查的异常与混合使用的问题。 虽然一些答案暗示使用其方法会导致难以阅读的用户代码。 我将使用此空间来提供可提高可读性的替代解决方案。 请注意,此问题特定于CompletableFuture。 这使我们能够提供更广泛地不扩展到lambda表达式的解决方案。 问题答案: 给定实用程序类(下面提供),用户可以无缝地抛出检查异常: 由lambda引发的任何异常(是否经过检查)都将