为什么第2行编译而第3行不编译?
spit()抛出已在第1行上捕获的HurtException,因此之后出现的所有检查的异常均不可访问。如果我删除第2行,则第3行仍然可以访问。异常不能免于编译时检查。在此先感谢您为我澄清此问题。

public class Ape {
    public void run() {
        try {
            spit();
        } catch (HurtException e) { //line 1
            System.out.println("f");
        } catch (LimpException ex) { //line 2: Unreachable, HurtException already caught
            System.out.println("e");
        } catch (Exception ee) {     //line 3: Compiles, why?
            System.out.println("r");
        }
    }

    public static void main(String[] args) {
        new Ape().run();
    }

    public void spit() throws HurtException {
        throw new HurtException();
    }

    class LimpException extends Exception {
    }

    class HurtException extends LimpException {
    }
}

最佳答案

编译器仅“知道”可能从HurtException抛出的spit(),因为您以这种方式明确定义了它。将LimpException添加到方法签名的throws部分应满足编译器的要求:

public void spit() throws HurtException, LimpException {
    throw new HurtException();
}


无论如何,如果该方法本身并没有真正抛出LimpException,则基本上只是使代码更难阅读。

09-05 20:35