java异常处理机制和抽象方法的重写或者接口方法的实现问题

qingrundeganbaba 2007-04-06 03:00:14
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为未检测异常

有人对异常机制内部研究过的来解释一下
...全文
635 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
mark
吴冬冬 2008-04-01
  • 打赏
  • 举报
回复
interface Inf1 {
void test1() throws IOException;
}

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

}
}



class MyException extends IOException {

}

这样写就可以通过
吴冬冬 2008-04-01
  • 打赏
  • 举报
回复
对于接口的实现也是一样
吴冬冬 2008-04-01
  • 打赏
  • 举报
回复
这才是正解,可以结贴了
吴冬冬 2008-04-01
  • 打赏
  • 举报
回复
在子类中一个重写的方法可能只抛出父类中声明过的异常或者异常的子类。这只适用于
方法重写而不适用于方法重载。所以如果如果一个方法有完全相同的名称和参数,它只能抛
出父类中声明过的异常或者异常的子类。
phsyf 2007-05-05
  • 打赏
  • 举报
回复
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

javalk 2007-05-05
  • 打赏
  • 举报
回复
up
qingrundeganbaba 2007-05-05
  • 打赏
  • 举报
回复
难道么人能解释清楚吗?
qingrundeganbaba 2007-04-06
  • 打赏
  • 举报
回复
我想了解的对于抽象方法或者接口中的方法声明异常有什么用处? 声明了异常之后在运行时后是怎么处理的?
henryfeifei 2007-04-06
  • 打赏
  • 举报
回复
估计也就是运行时异常和非运行时异常的区别,楼主可以多试 几次其他运行时异常和非运行时异常,看看能不能得到这个结论
wddlqd 2007-04-06
  • 打赏
  • 举报
回复
mark
qingrundeganbaba 2007-04-06
  • 打赏
  • 举报
回复
interface Inf1 {
void test1() throws MyException;
}

修改为
abstract class Inf1{
abstract void test1() throws MyException;

}

也是一样的的了
createthread 2007-04-06
  • 打赏
  • 举报
回复
来学习。
lixiaoxue85 2007-04-06
  • 打赏
  • 举报
回复
接口是接口 接口不是类,接口用来实现的,不存在和实现他的类的 父子类关系
Dan1980 2007-04-06
  • 打赏
  • 举报
回复
throws java.lang.NumberFormatException 属于声明一个运行时异常。由运行时异常无需声明,所以编译器在编译时会忽略这句。
RayBB 2007-04-06
  • 打赏
  • 举报
回复
NumberFormatException为RuntimeException,所以编译不会有错误,至于运行不报错,应该是针对的父类而不是接口(继承而不是实现)

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

个人理解 大师们帮解释下
shangclai 2007-04-06
  • 打赏
  • 举报
回复
传说中的沙发,顶起来!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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