gpt4 book ai didi

java - SonarQube 错误 : Refactor this method to throw at most one checked exception

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:28 29 4
gpt4 key购买 nike

我正在使用 SonarQube,它显示以下错误:

Public methods should throw at most one checked exception.

// Noncompliant
public void delete() throws IOException, SQLException { /* ... */ }

// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }

这是否意味着 SomeApplicationLevelException 是一个父类,而 IOExceptionSQALException 是从它派生的?而我们应该抛出父类异常?从而坚持只抛出 1 个已检查异常的方法?

因为我定义了 2 个异常,例如 Exception1 和扩展 ExceptionException2。我的方法说,sampleMethod() 抛出它们,即,

public void sampleMethod() throws Exception1, Exception2 {
}

错误在这里显示。那么我是否应该将一个类作为父类(比如 MainException)并从中派生 Exception1Exception2 并抛出父异常类?如下所示:

public void sampleMethod() throws MainException {
}

上述方案是否合适?

最佳答案

如果您的应用程序中有一个声明为throws SQLException, IOException 的方法,您可能正在向您的方法的用户泄露内部实现细节。具体来说,您是说:

  1. 您的方法是使用 JDBC 和文件 I/O 实现的。您的用户不关心您的方法是如何实现的;他们只关心你的方法做了什么。

  2. 您的方法,包括它的任何 future 版本,永远不会抛出任何其他已检查的异常。如果将来您更改您的方法,使其可能抛出另一个已检查的异常,它将破坏向后兼容性。

建议是创建您自己的特定于应用程序的类(派生自 Exception),并且只在您的方法中抛出它。如果愿意,您可以将 SQLException 或 IOException(或任何其他异常)包装在应用程序特定的异常中作为 原因

但是请注意,有一种观点认为 Java checked exceptions are a bad idea (这也是 C# 和 Kotlin 等更现代的语言没有检查异常的原因之一)。

更新:以上答案与问题的第一个版本相关(编辑#1)。该问题随后被更新以指出两个抛出的异常是应用程序定义的异常,因此上述大部分理由不再适用。 this post 中解释了更新问题的答案。 .

关于java - SonarQube 错误 : Refactor this method to throw at most one checked exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46278571/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com