Javac / Eclipse - 如果方法没有抛出最具体的异常,则发出警告

时间:2017-10-18 21:25:06

标签: java eclipse warnings javac

我有一个这样的课程:

public class FooBar
{

    public String foo() throws Exception {
        return "";
    }

    public String bar() throws Exception {
        throw new BazException();
    }

}

在日食中,我收到方法foo的警告:

  

FooBar类型的方法foo()实际上没有抛出声明的异常Exception

见下文:

enter image description here

问题:是否可以为方法bar配置silmiar警告?方法bar不会抛出最具体的异常。

我正在使用:

  • Eclipse氧气释放(4.7.0)
  • Java 8

2 个答案:

答案 0 :(得分:1)

您的帖子提出了两个不同的问题。第一期:

  

是否可以为方法栏配置类似的警告?

是的,但不需要配置。如果一个方法声明它抛出了一些异常的子类型但实际上没有,那么在Eclipse中将显示与您报告的类型相似的警告。关于该警告,类型例外的例外没有什么特别之处。

在你的代码中只需更改方法 foo()以抛出 BazException 而不是 例外看到:

Exception warning message

第二期:

  

方法栏不会抛出最具体的异常。

这是事实,但是这个问题与获取有关不会抛出异常的消息有所不同。没有办法配置Eclipse来抛出像“方法{m}没有抛出它可能”这样的最特殊异常的消息,因为Eclipse的编译器错误列表中没有这些行的消息/警告。

此外,这种消息的措辞可能会在一个引发多个异常的复杂方法中变得棘手和复杂。也许代码分析工具(例如PMD)可以为您识别违规方法。

答案 1 :(得分:0)

,Eclipse仅在第一种情况下显示警告,因为抛出一个永远不会发生的异常是代码异味,而抛出更一般的异常不是代码味道

抛出一个永远不会发生的异常

强制调用者不必要地处理异常,例如:

public class Foo {

    public static void main(String[] args) {
        Foo foo = new Foo();
        try {
            System.out.println(foo.foo());
        } catch (IOException e) {
            // unreachable code
        }
    }

    public String foo() throws IOException {
        return "";
    }

}

对于简化的异常处理,有些人更喜欢将throws Exceptionthrows Throwable声明添加到几乎所有方法中。因此,可以将警告配置为忽略这些特殊情况:在 Project>中属性:Java编译器>错误/警告部分不必要的代码>不必要的抛出异常声明取消选中忽略'异常'和' Throwable的'

注意,如果接口方法具有throws声明,则实现类不需要还有throws声明:

public class Foo implements IFoo {

    public String foo() {
        return "";
    }

}

interface IFoo {
    String foo() throws IOException;
}

抛出更普遍的例外

如果您想要隐藏来自调用方的详细信息,则更常见的例外非常有用(出于与大多数情况下List list = new ArrayList();相比ArrayList list = new ArrayList();更适合的原因)。它使您可以更灵活地更改方法的代码,而无需修改调用者的代码。

但是,也许您可​​以使用SpotBugsCheckstylePMD或类似的插件创建问题标记。如果有的话,我建议只对私人方法这样做。