public class MyClass {
public static void method() {
try {
// there is no compile time error for unnecessary catching 'Exception'
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// why compile time error for unnecessary catching 'MyException' or
// 'CloneNotSupportedException' etc..
// ultimately Exception, MyException & CloneNotSupportedException all
// are checked exception
} catch (MyException e) {
e.printStackTrace();
}
}
}
class MyException extends Exception {
}
second scenario
---------------
public class MyClass {
public static void method() throws Exception {
}
public static void main(String[] args) {
// if Exception itself is not checked ,
// why compile time error occured for calling method(); ??
method();
}
}
答案 0 :(得分:3)
因为RuntimeExceptions是Exception类的子类。因此,编译器无法确定某些代码是否会抛出任何运行时异常,因为它们可能会被jvm抛出。 另一方面 - 必须声明由某些方法抛出的已检查异常,因此编译器知道可以抛出哪些异常并且可以确定不必要的catch块。
答案 1 :(得分:1)
方法声明它们抛出的异常。如果您正在捕获任何不是任何已知异常类型的超类的内容,则无需捕获。
答案 2 :(得分:0)
我们已检查例外,已取消选中例外。 CloneNotSupportedException
是一个经过检查的异常:如果方法抛出,则调用者需要捕获这种类型的异常。在这些情况下,jvm可以检测到,如果它被捕获,而try块内的方法都没有抛出它。
Exception
本身未经过检查。