从 java 方法抛出异常时,更通用的方法会覆盖更具体的方法吗?

When throwing an exception from a java method, will a more general one override a more specific one?

确切的错误是:"There is a more general exception, 'java.lang.exception' in the throws list already"

我有这样的方法:

public String myMethod() throws FileNotFoundException, IOException, Exception {
        try{  
            // DO STUFF

        }catch(FileNotFoundException e){
            // DO STUFF  
          throw new FileNotFoundException("custom message", e);

        }catch(IOException e){
          // DO STUFF
          throw new IOException("custom message", e); 

        }catch(Exception e){
          throw new Exception("custom message", e); 
        }
        return myString;
}

Intellij 告诉我前两个是多余的,因为我最后有更通用的 Exception,是这样吗?
即使我明确抛出 IOException,该方法也会抛出 Exception 吗?
还是通用异常无论如何都会被抛出堆栈,所以我什至不需要最后 Exception

IntelliJ 确实告诉您第二个 catch 块从未到达。 FileNotFoundExceptionIOException 的子类型,因此如果发生此类异常,则 将执行第一个 catch 块,因为 IOException 匹配 FileNotFoundException 被抛出。

catch 块总是按照声明的顺序求值。这意味着如果你交换两个 catch 块,它就会工作。

更新

根据您的评论,IntelliJ 注意到您的不是 try-catch 块,而是 throws 子句。

那是因为对于checked exceptions,Java强制你在方法声明中声明它们被抛出。只需要在 throws 子句中声明 最一般的 异常。 IDE 是说因为你声明 Exception 被抛出,所以没有必要也声明 Exception 的任何子类,因为这些情况已经被 Exception 涵盖了。

但是,您可能仍想这样做的原因是为了向调用者提供更多信息。请参阅软件工程 StackExchange 上的 this question and answer

更多信息:

  • Declare method to throw an exception and subclass of this exception

我强烈建议您不要捕获过于笼统的异常。这通常是一种代码味道。

  • Is it really that bad to catch a general exception?