我有以下简单的代码:
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
?
答案 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 {
}