Javac/Eclipse-如果方法不可用,则发出警告';t抛出它所能抛出的最具体的异常

Javac/Eclipse-如果方法不可用,则发出警告';t抛出它所能抛出的最具体的异常,java,eclipse,warnings,javac,Java,Eclipse,Warnings,Javac,我有一门课是这样的: public class FooBar { public String foo() throws Exception { return ""; } public String bar() throws Exception { throw new BazException(); } } 在eclipse中,我在方法foo上收到一条警告,指出: 声明的异常实际上不是由FooBar类型的foo()方法引发的

我有一门课是这样的:

public class FooBar
{

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

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

}
在eclipse中,我在方法
foo
上收到一条警告,指出:

声明的异常实际上不是由FooBar类型的foo()方法引发的

见下文:

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

我正在使用:

  • Eclipse氧气释放(4.7.0)
  • 爪哇8

    • 你的文章提出了两个截然不同的问题。第一期:

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

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

      在代码中,只需将方法foo()更改为抛出BazException,而不是 异常查看:

      第二期:

      方法栏不会抛出它可能引发的最具体的异常

      这是真的,但这是一个不同于获取一条关于根本没有抛出异常的消息的问题。无法将Eclipse配置为抛出类似“方法{m}不会抛出它可能抛出的最特定异常”的消息,因为Eclipse的编译器错误/警告列表中没有这类消息


      此外,这样一条消息的措辞可能会变得棘手,在一个引发多个异常的复杂方法中变得复杂。也许像这样的代码分析器工具可以为您识别有问题的方法。

      ,Eclipse只在第一种情况下显示警告,因为引发永远不会发生的异常是一种代码气味,而引发更一般的异常则不是代码气味

      正在引发永远不会发生的异常 这会不必要地强制调用方处理异常,例如:

      公共类Foo{
      公共静态void main(字符串[]args){
      Foo-Foo=新的Foo();
      试一试{
      System.out.println(foo.foo());
      }捕获(IOE异常){
      //不可达代码
      }
      }
      公共字符串foo()引发IOException{
      返回“”;
      }
      }
      
      为了简化异常处理,有些人通常喜欢将
      抛出异常
      抛出可抛出的
      声明添加到几乎任何方法中。因此,可以将警告配置为忽略以下特殊情况:在项目>属性:Java编译器>错误/警告中,不必要的代码部分>抛出异常的不必要声明取消选中忽略“异常”和“可丢弃”

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

      公共类Foo实现IFoo{
      公共字符串foo(){
      返回“”;
      }
      }
      接口IFoo{
      字符串foo()抛出IOException;
      }
      
      抛出更一般的异常 如果希望对调用方隐藏详细信息,则更一般的例外情况非常有用(出于相同的原因,在大多数情况下,您应该更喜欢
      List List=new ArrayList();
      而不是
      ArrayList List=new arrarylist();
      )。它使您可以更灵活地更改方法的代码,而无需修改调用方的代码


      但是,也许您可以使用标记或类似的插件来创建问题。如果有的话,我建议只对私有方法执行此操作。

      引发更一般的异常不是代码气味。
      -我将此视为代码气味,这就是我希望有编译器警告或相关信息的原因。为什么这是您的代码气味?注意,Eclipse中也没有Refactor>Generalize声明类型的反函数。@howlger Re“为了简化异常处理,有些人通常喜欢将throws异常或throws-Throwable声明添加到几乎任何方法中”,请参阅Joshua Bloch的effective Java:“…永远不要声明一个方法‘抛出异常’或者更糟糕的是‘抛出可丢弃的’。”我通常拒绝调用权威机构,但在这种情况下,我会做出一个例外。@skomisa,因为这里有不同的观点,我写道“有些人更喜欢””“我不推荐。如果没有人会使用它,Eclipse中就不会有它的设置,Joshua Bloch也不会提到它。我们都同意,在这种情况下,能够显示警告是件好事。我们不同意抛出更一般的异常是否总是一种代码味道。我的论点是,当通过抛出额外的特定异常来更改实现时,更一般的异常不会破坏与调用方的契约。对不起,我认为我的问题有点不清楚。只有真正询问您将什么标记为“第二个问题”。@sixtyfootersdude OK,明白了,因此您的问题的答案是“否”,因为Eclipse没有为您描述的“最具体的异常”场景提供警告。(不过我很喜欢这个主意。)@sixtyfootersdude同样,我检查了PMD,不幸的是它没有解决您的问题。仅供参考,您可以在此处看到PMD处理的所有异常情况: