2010-08-19 48 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()方法

现在如果在父类中将IOException异常替换为子类中的RemoteException,反之亦然。然后它正在编译。

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

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

回答

4

当重写一个引发异常的方法时,您只能抛出相同的异常或该异常的更具体的子类型。

RemoteException是IOException的子类型。因此,当父方法抛出IOException时,您的子方法可能会抛出RemoteException。

你也可以通过逻辑思考。如果一个子方法抛出比父方法更广泛的Exception,那么该方法可能会抛出一个与父项不匹配的Exception。

+0

非常感谢。 现在我已经试过你所说的,它正在工作 – user392675 2010-08-19 11:14:28

+1

围绕这些部分的礼仪,因为你标记了你认为正确的答案是正确的。 – 2010-08-19 15:58:53

1

“相同级别”不计数。在继承中,你总是可以只专注于事物。因此class2.m1可以抛出继承原始异常的任何东西,但不能扩大异常(如抛出Throwable)或抛出完全不同的异常(IOException不会从RemoteException继承)。例如,您可以使用FileNotFoundException重载IOException。原因是渔获:

} catch(IOException e) { ... } 

此工程的IOException亚型,但会破坏其他的事。这是不是开发商所期待的。

2

你可以在一个超级方法中抛出一个更具体的异常,但不是一个不太具体的异常。 RemoteException是IOException的一个子类,因此class1可以抛出IOException和class2 RemoteException,但不会相反。

+0

非常感谢。 现在我已经尝试了你所说的,它正在工作 – user392675 2010-08-19 11:15:09

0

与返回类型一样(自Java 5以来)方法签名中提到的异常是协变的。

这意味着您可以让它们在继承原始方法的类中更具体。这个概念也被称为缩小约束,因为你可以更具体地说明这些类型。

public class Foo {...} 


public class SomeException extends Exception {...} 


public class A{ 
    public Foo methodName() throws SomeException{...} 
} 


public class Bar extends Foo {...} 


public class SomeSpecificException extends SomeException {...} 


public class B extends A { 
    public Bar methodName() throws SomeSpecificException {...} 
} 

因此,您可以随时“继续”继承层次结构。

// Doesn't compile  
public class B extends A { 
    public Object methodName() throws Exception {...} 
} 

试图扩大约束不起作用。