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

java异常处理机制和抽象方法的重写或者接口方法的实现问题
java类的方法重写时规定子类方法重写不能抛出超越父类方法定义的异常类的范围这个时没错的

但是对于抽象方法或者接口竟然编译运行通过:
举例如下:
import   java.io.IOException;

class   MyException   extends   Exception   {

}

interface   Inf1   {
void   test1()   throws   MyException;
}

class   A   implements   Inf1   {
public   void   test1()   throws   java.lang.NumberFormatException   {
// public   void   test1()   throws   IOException   {
NumberFormatException   e   =   new   NumberFormatException( "测试 ");
throw   e   ;

}
}

如上NumberFormatException   和   MyException时没有继承体系的,但是该方法编印和运行都正确
但是大家看注释的那一行,如果抛出IOException   则编译出错

IOException     未已检测异常
NumberFormatException   和MyException为未检测异常

有人对异常机制内部研究过的来解释一下


------解决方案--------------------
传说中的沙发,顶起来!
------解决方案--------------------
NumberFormatException为RuntimeException,所以编译不会有错误,至于运行不报错,应该是针对的父类而不是接口(继承而不是实现)

IOException 是Exception的子类,不属于运行期异常,所以编译出错

个人理解 大师们帮解释下

------解决方案--------------------
throws java.lang.NumberFormatException 属于声明一个运行时异常。由运行时异常无需声明,所以编译器在编译时会忽略这句。
------解决方案--------------------
接口是接口 接口不是类,接口用来实现的,不存在和实现他的类的 父子类关系
------解决方案--------------------
来学习。
------解决方案--------------------
mark
------解决方案--------------------
估计也就是运行时异常和非运行时异常的区别,楼主可以多试 几次其他运行时异常和非运行时异常,看看能不能得到这个结论

------解决方案--------------------
up
------解决方案--------------------
Dan1980() ( ) 信誉:98 Blog 加为好友 2007-4-6 15:51:59 得分: 0



throws java.lang.NumberFormatException 属于声明一个运行时异常。由运行时异常无需声明,所以编译器在编译时会忽略这句。



===================================================================================

是正确的答案


RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。

可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。

java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IllegalArgumentException
java.lang.NumberFormatException


------解决方案--------------------
在子类中一个重写的方法可能只抛出父类中声明过的异常或者异常的子类。这只适用于 
方法重写而不适用于方法重载。所以如果如果一个方法有完全相同的名称和参数,它只能抛 
出父类中声明过的异常或者异常的子类。