2010-08-19 60 views
2

只是看看下面的程序..Java异常的继承处理

import java.io.*; 
import java.rmi.*; 
class class1 
{ 
public void m1() throws RemoteException 
{ 
System.out.println("m1 in class1"); } } 

class class2 extends class1 
{ 
    public void m1() throws IOException 
{ 
    System.out.println("m1 in class2"); 

} } 

class ExceptionTest2 
{ 
public static void main(String args[]) 
{ 
    class1 obj = new class1(); 
    try{ 
obj.m1(); 
} catch(RemoteException e){ System.out.println("ioexception"); } 

} } 

编译时错误.....不能覆盖M1()方法

现在,如果我取代RemoteException的父类在子类中IOException异常,反之亦然。然后它正在编译。

任何其他检查的异常组合在这里都不起作用,即使我使用的检查异常处于同一级别。

现在我很困惑,为什么重写只发生在一种情况下,而不是在其他情况下发生?我会真的明白你的答案。

+0

你已经发布了这个问题http://stackoverflow.com/questions/3520596/i-am-learning-the-exception-handling-in-java-basically-in-inheritance – 2010-08-19 10:30:17

回答

0

RemoteException是一个IOEception,但不是其他方式。由于第2类扩展了第1类,所有抛出的异常必须与超类异常兼容。当class1.m1抛出一个IOException时,class2.m1可以抛出一个RemoteException,因为这是一个IOException异常。

0

因为具有相同签名的两个方法不能抛出不同类型的异常。

2

RemoteExceptionIOException更具体,所以你可以声明继承类的成员m1()引发这个。 (RemoteException继承自IOException,因此RemoteException是一种特殊的IOException)。

它不工作的另一种方式圆:通过指定class1类型的ANY对象抛出其成员m1()一个RemoteException,你不能指定在class2相同的方法将引发更多的东西通用的(因为class2型对象也是class1类型的对象)。

3

ExceptionsInheritance规则是这样的:

“当子类覆盖在父类的方法,然后子类方法的定义可以只能指定parentthrows子句中的异常类的所有或子集类方法(或重写方法)“。

RemoteException继承IOException,所以RemoteException是子类,IOEXception是超类。它意味着覆盖父类(class1)方法的子类(class2)方法,该方法抛出IOException,可以throwRemoteException但反之亦然。