在此示例中,第二个catch块不可访问,因此我的代码无法编译。但是,如果我将LimpException扩展为RuntimeException而不是Exception,则可以毫无问题地进行编译。为什么?

public class Finals {

  public void run() {
    try {
      spit();
    } catch (HurtException e) {
      System.out.println("");
    } catch (LimpException ex) { // does not compile, unreachable code
      System.out.println("");
    }
  }

  public void spit() throws HurtException { // method that throws the Exception
  }

  public static void main(String... args) {
  }
}

class LimpException extends Exception { // extends Exception vs extends
                                        // RuntimeException
}

class HurtException extends LimpException {
}

最佳答案

根据JLS §11.2:

那很简单。即使该代码块仍然无法访问,编译器也不会检查。
在您的示例中,无法从尚未被LimpException catch块捕获的try语句主体中抛出catch LimpException。这是JLS §11.2.3禁止的:

10-06 09:56