在编译时,JVM如何找到不必要的CloneNotSupportedException,但不是Exception?

时间:2010-12-07 10:53:08

标签: java exception-handling


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();
    }
}



3 个答案:

答案 0 :(得分:3)

因为RuntimeExceptions是Exception类的子类。因此,编译器无法确定某些代码是否会抛出任何运行时异常,因为它们可能会被jvm抛出。 另一方面 - 必须声明由某些方法抛出的已检查异常,因此编译器知道可以抛出哪些异常并且可以确定不必要的catch块。

答案 1 :(得分:1)

方法声明它们抛出的异常。如果您正在捕获任何不是任何已知异常类型的超类的内容,则无需捕获。

答案 2 :(得分:0)

我们已检查例外,已取消选中例外。 CloneNotSupportedException是一个经过检查的异常:如果方法抛出,则调用者需要捕获这种类型的异常。在这些情况下,jvm可以检测到,如果它被捕获,而try块内的方法都没有抛出它。

Exception本身未经过检查。