2

为什么第 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 {
    }
}
4

2 回答 2

3

编译器只“知道”HurtException可能会被抛出,spit()因为您以这种方式明确定义了它。添加LimpExceptionthrows方法签名的部分应该满足编译器:

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

无论如何,如果该方法没有真正抛出LimpException自己,那么您基本上只会使您的代码更难阅读。

于 2015-09-25T13:57:10.143 回答
2

第 3 行编译,因为Exception它是所有 RuntimeExceptions 的超类,如果抛出这种异常,它将(在运行时)与(catch Exception)块的主体一起处理。

编译器无法确定此类异常是否会在运行时引发,因此不会将其标记为不可访问

于 2015-09-25T13:56:57.673 回答