问题
I have this snippet.
public final class StackOverflow{
class MyException extends Throwable{
}
private void a(){
try{
}catch(MyException | Exception e){
}
}
}
exception StackOverflow.MyException is never thrown in body of corresponding try statement
I know that Exception is extending Throwable as well and also is a checked exception also MyException is extending Throwable which mades also a checked exception!
My question is why Exception is not required to be thrown in the try catch but MyException is? I think that both are checked exception so which is the difference??
Sorry if the question is simple.
回答1:
It is explained in the Java Language Specification (emphasis in bold):
It is a compile-time error if a
catchclause can catch checked exception class E1 and it is not the case that thetryblock corresponding to thecatchclause can throw a checked exception class that is a subclass or superclass of E1, unless E1 isExceptionor a superclass ofException.
I guess the rationale behind this is that: MyException is indeed a checked exception. However, unchecked exceptions also extend Exception (transitive inheritance from RuntimeException), so having a catch include the Exception class is excluded from the exception analysis done by the compiler.
回答2:
Exception extends from RuntimeException will considered as uncheched exception, so it's ok:
class MyException extends RuntimeException { }
try {
...
} catch (MyException e) {
}
Your exception extends from Throwable, so it is cheched exception. Since the compiler noticed that it is never thrown, so the compile fails.
来源:https://stackoverflow.com/questions/52041230/java-exception-as-checked-exception-but-not-required-to-be-thrown-in-trycatch