日期:2014-05-20  浏览次数:20794 次

一道Java题,请帮忙验证一下是不是答案有错,谢谢
Question 72 
Given: 
11.classA 

12. public void process() { System.out.print(“A “)} } 
13. class B extends A { 
14. public void process() throws RuntimeException
15. super.process(); 
16. if (true) throw new RuntimeException(); 
17. System.out.print(“B”) 
}} 
18. public static void main(String[] args) { 
19. try { ((A)new B()).process(); } 
20. catch (Exception e) { System.out.print(“Exception “)} 
21. } 
What is the result? 

A. Exception 
B. A Exception 
C. A Exception B 
D. A B Exception 
E. Compilation fails because of an error in line 14. 
F. Compilation fails because of an error in line 19. 
Answer: B 

我照着输入后,在CMD下编译没有问题,运行java B时,CMD提示:Exception in thread “main” java.lang.NoClassDefFoundError: B.所以我觉得答案都不对。

还有一个问题是:为什么class B中的process方法可以有throws RuntimeException这个动作呢?因为父类A中process()并没有这个动作,在B中加入了如此动作不就是违反了继承类中的函数方法不可以比父类中的继承方法更加严格的规定吗?

谢谢。。。

------解决方案--------------------
答案是:B
因为RuntimeException是一个unchecked exception,加不加throws RuntimeException是无关紧要的.执行过程是:((A)new B()).process(); 真正调用的是B中重写的process() ,而它调用A的 process() ,然后throw new RuntimeException(); 被抓后 catch (Exception e) { System.out.print(“Exception “)} ,故答案是:B

------解决方案--------------------
1、java B呀,应是运行java A,细心点呀!

2、类中的函数方法不可以比父类中的继承方法更加严格的规定:这是说方法名之前的修饰符权限。从低到高是:
 private
 default
 protected 
 public 



------解决方案--------------------
楼主,再去检查一下代码输入错误没有? 
 答案是B.
我也运行过了.是B啊!

在异常处理中分为check 和uncheck 异常. 其中uncheck异常是不用try编译 也是没有任何错误的.但是运行当然会有异常因为你抛出了这个异常了嘛! 就是说你告诉jvm这里有个错误让它给你打印到输出上! 
继承的时候, 确实是 子类中继承自父类的方法 抛出的异常不能超出父类抛出异常的范围! 但是 普通的方法没有抛出任何异常的,可以看做是抛出的是RuntimeException.
所以子类方法中 可以抛出 RuntimeException 的子类.
这是java规定的,其实没什么好说的,记住就好了.

支持 2楼
------解决方案--------------------
支持2楼