从 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 块从未到达。 FileNotFoundException
是 IOException
的子类型,因此如果发生此类异常,则 将执行第一个 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?
确切的错误是:"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 块从未到达。 FileNotFoundException
是 IOException
的子类型,因此如果发生此类异常,则 将执行第一个 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?