具有多个catch语句的无法访问的代码

时间:2015-09-25 13:50:48

标签: java exception-handling try-catch unreachable-code catch-block

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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