Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SonarQube错误:重构此方法以引发最多一个已检查异常_Java_Exception Handling_Sonarqube - Fatal编程技术网

Java SonarQube错误:重构此方法以引发最多一个已检查异常

Java SonarQube错误:重构此方法以引发最多一个已检查异常,java,exception-handling,sonarqube,Java,Exception Handling,Sonarqube,我正在使用SonarQube,它显示以下错误: Public methods should throw at most one checked exception. // Noncompliant public void delete() throws IOException, SQLException { /* ... */ } // Compliant public void delete() throws SomeApplicationLevelException { /* ... *

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

Public methods should throw at most one checked exception.

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

// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }
这是否意味着,
SomeApplicationLevelException
是一个父类,
IOException
SQALException
是从它派生的?我们应该抛出父类异常吗?从而坚持只抛出1个已检查异常的方法

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

public void sampleMethod() throws Exception1, Exception2 {
}
这里显示了错误。所以,我应该有一个类作为父类(比如说
MainException
),并从中派生
Exception1
Exception2
,然后抛出父异常类吗?如下图所示:

public void sampleMethod() throws MainException {
}

上述解决方案正确吗?

IOexception和sqlexception都是检查异常,彼此完全不同,现在如果我们从一个异常扩展它们并抛出父异常(在java中不是强制性的),这将有点误导api的用户

但是,如果您想在应用程序中执行此操作以避免出现错误,您可以捕获所有特定异常,并在异常消息中抛出一个封装原始异常信息的自定义异常

比如说

try{

      ///piece of code that throws IOException and SQLException
}catch(IOException | SQLException ex){
   throw new DataException(ex,"Any customized message you want");
}
然后,此DataException将包含在具有此try-catch的方法签名的throws子句中


DataException扩展了Exception类,通过在构造函数中传递ex,您将原始异常包装到自定义异常中,并保留原始异常信息。

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

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

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

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

    然而,请注意,有一个学派认为(C#和更现代的语言,如Kotlin,没有检查异常的原因之一)


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

    听起来这是您案例的解决方案:D或者您为该方法生成一个专用异常,它提供了更多的信息。我有相同的“重大”错误,可能会对几个项目提出投诉。在我的办公室与几位中小企业人士交谈后,两种思想流派都有支持者和批评者。我的意见是创建一个
    MainException
    parent类,就像你所说的那样,让我们高兴。谢谢你的回复。您能否给出一个示例/伪代码,说明如何在catch块中使用基于自定义的异常来包装它们。对不起,因为我是新来的,我没有完全理解。我已经把我的答案编辑成不可操作的例子,希望它清楚