2010-08-19 78 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 {...} 
} 

試圖擴大約束不起作用。