2015-09-01 53 views
2

據我所知,構造函數沒有被繼承。爲什麼異常應該繼承處理,因爲構造函數沒有被繼承?

那麼在子構造函數中處理異常的原因是什麼。在創造小孩的對象或者什麼的時候,有什麼地方有人在創造父對象?

public class Parent { 
    public Parent() throws Exception{ 

    } 
} 

class Child extends Parent { 
    public Child(){ // compile time error "Unhandled Exception Type" 

    } 
} 

我不是想通過調用Super()孩子的構造函數中給init父類。我不明白爲什麼我們必須這樣做。

在此先感謝。

+1

'super()'被隱式調用。看到這個:http://stackoverflow.com/questions/2632882/calling-super – BackSlash

回答

4

參考JLS 8.8.7 Constructor Body

如果構造體不明確的構造函數調用開始...然後在構造函數體隱式超類構造函數調用超級開始();

換句話說,下面的代碼在語義上等同於您的Child類的定義:

class Child extends Parent { 
    public Child(){ // compile time error "Unhandled Exception Type" 
     super(); // This throws Exception. 
    } 
} 

這有可能發生,因爲這是必要的初始化初始化Parent實例必須發生。試想,如果超級構造是不叫會發生什麼:

class Parent { 
    private final Frobnitz foo; 

    Parent() throws Exception { 
    foo = new Frobnitz(); 
    } 

    void doSomething() { 
    foo.doYourFrobbing(); 
    } 
} 

class Child extends Parent { ... } 

class Main { 
    public static void main(String[] args) { 
    new Child().doSomething(); // Would cause a NPE unless Parent() is called (implicitly or explicitly). 
    } 
} 
+0

感謝您的意見。得到它了。 – JBaba

+0

如果以[JLS 8.8.7構造函數體](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls)爲參考開始,這個答案會更好。 -8.8.7):「*如果一個構造函數體沒有以一個顯式的構造函數調用開始......那麼構造函數體隱式地以超類構造函數調用'super();'*」 –

+0

@AndyBrown開始,感謝建議。 –

3

如果創建類型的子對象,父類的構造函數被調用(顯式或隱式)。這就是爲什麼你需要捕捉異常。

3

如果您在子類的構造函數中不顯式調用super(),那麼它會隱式調用,所以您必須捕獲該異常,或者聲明您的子類的構造函數拋出Exception。