2010-08-19 57 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但反之亦然。