Java中,父类方法抛出异常,子类方法Override后,在调用时,为什么引用的类型会导致捕获的异常不相同

Y_JunKang 2016-04-08 08:31:22
当父类方法抛出异常时,子类去Override这个方法,需要抛出父类异常的子类,或者是不抛出异常。

但是编写一个小demo的时候发现一个奇怪的问题,当指向实例的引用改变时,需要捕获的异常也跟着改变了,这时为什么呢?
编译器不是能够记住每个实例创建时候的类型吗,为什么改变引用,对异常的捕获情况就不一样了,不是很理解。


public class Test {

static class A {
public void method() throws Exception {
System.out.println("A");
}
}

static class B extends A {
@Override
public void method() {
System.out.println("B");
}
}

public static void main(String[] args) {

A a = new A();
A b = new B();
B c = new B();

//为什么改变了引用的类型,catch的Exception也会跟着改变
//输出任然为B,说明调用的是B.method,但是B.method并没有抛出异常
//这里捕获了A.method的异常,这是为什么
try {
b.method();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//这个地方不需要捕获异常,
c.method();
}
}

...全文
500 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Y_JunKang 2016-04-14
  • 打赏
  • 举报
回复
的确是把运行时和编译搞混了,异常的捕获是编译器更具对象的引用类型觉定的。而不是类似运行时对象的实际类型决定。
BEFORE__4 2016-04-08
  • 打赏
  • 举报
回复
A b = new B();
在这个过程中你定义的b其实是A类,它算作A,所以会抛出父类异常,而不是子类异常。
家里敷泥呀 2016-04-08
  • 打赏
  • 举报
回复
jvm会根据你定义的类型来判断是否需要捕获异常,而不是其实际类型。 毕竟这是编译期的活,编译器,他也只知道你是定义的这个类型,而非创建的这个类型。 例如:

public class Test {
	static class A {
		public void method() throws Exception {
			System.out.println("A");
		}
	}
	static class B extends A {
		@Override
		public void method() {
			System.out.println("B");
		}
		public void onlyInB() {
			System.out.println("onlyInB");
		}
	}

	public static void main(String[] args) {
		A obj = new B();
		obj.onlyInB(); // 这行代码是会报错的
	}
}

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧