使用正确的方法无法处理捕获的异常

时间:2014-12-02 10:52:59

标签: java exception

我有以下简单的代码:

class Test {

    public static void main(String[] args) {

        Test t = new Test();

        try {
            t.throwAnotherException();
        } catch (AnotherException e) {
            t.handleException(e);
        }

        try {
            t.throwAnotherException();
        } catch (Exception e) {
            System.out.println(e.getClass().getName());
            t.handleException(e);
        }

    }

    public void throwAnotherException() throws AnotherException {
        throw new AnotherException();
    }

    public void handleException(Exception e) {
        System.out.println("Handle Exception");
    }

    public void handleException(AnotherException e) {
        System.out.println("Handle Another Exception");
    }

}

class AnotherException extends Exception {

}

为什么在第二个catch中调用的方法是具有签名void handleException(Exception e)的方法,而异常的类型是AnotherException

4 个答案:

答案 0 :(得分:6)

重载方法在编译时解析,基于形式参数类型,而不是运行时类型

这意味着,如果B extends A,你有

void thing(A x);

void thing(B x);

然后

B b = new B();
thing(b);

会查找thing() B,因为b的正式类型为B;但

A b = new B();
thing(b);

将查找带有thing()的{​​{1}},因为A的正式类型为b,即使其运行时实际类型为A }。

在您的代码中,B的正式类型在第一种情况下为e,在第二种情况下为AnotherException。在每种情况下,运行时类型都是Exception

答案 1 :(得分:0)

AnotherException扩展了Exception,这意味着你在任何地方使用" Exception",使用" AnotherException"的实例。将符合资格。

您应该阅读有关扩展类的详细说明,了解其工作原理,因为它在编程中非常重要。

答案 2 :(得分:0)

我想你想测试哪个Exception会被抓住,对吧?

然后修改您的代码只抛出一个Exception

    try {
        t.throwAnotherException();
    } catch (AnotherException e) {
        t.handleException(e);
    }
    catch (Exception e) {
        System.out.println(e.getClass().getName());
        t.handleException(e);
    }

正在按预期工作。

答案 3 :(得分:0)

Exception是超类,所以如果你用(例外e)编写catch子句,它首先会得到满足并被执行。

要改进您的代码,您可以修改代码,如下所示。

class Test {

    public static void main(String[] args) {

        Test t = new Test();

        try {
            t.throwAnotherException();
        } catch (AnotherException e) {
            t.handleException(e);
        }

        try {
            t.throwAnotherException();
        }catch (AnotherException e) {
            t.handleException(e);
        }catch (Exception e) {
            System.out.println(e.getClass().getName());
            t.handleException(e);
        }

    }

    public void throwAnotherException() throws AnotherException {
        throw new AnotherException();
    }

    public void handleException(Exception e) {
        System.out.println("Handle Exception");
    }

    public void handleException(AnotherException e) {
        System.out.println("Handle Another Exception");
    }

}

class AnotherException extends Exception {

}