Java Exception as checked Exception but not requir

2020-04-07 16:54发布

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.

2条回答
ら.Afraid
2楼-- · 2020-04-07 16:59

It is explained in the Java Language Specification (emphasis in bold):

It is a compile-time error if a catch clause can catch checked exception class E1 and it is not the case that the try block corresponding to the catch clause can throw a checked exception class that is a subclass or superclass of E1, unless E1 is Exception or a superclass of Exception.

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.

查看更多
手持菜刀,她持情操
3楼-- · 2020-04-07 17:24

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.

查看更多
登录 后发表回答