2016-11-23 91 views
0

我正在編寫一個程序,演示如何使用繼承和重寫方法。我想創建一個涉及使用異常的if語句。我在我的if語句中包含了這個異常,但是當我在方法的開頭寫入「throws exception」時,我得到n錯誤消息,說「」重寫方法不會拋出異常。「以下是代碼:「重寫的方法不會拋出異常」?

子類

public class Carnivore extends Animal 
{ 
    public Food eat(Food x) throws Exception 
    { 
     if (x.equals("Plants")) { 
       throw new Exception("Carnivores only eat meat!"); 
      } else { 
       return x; 
      } 

    } 
    public void makeNoise() 
    { 
     noise = null; 
    } 
    public String getNoise() 
    { 
     return noise; 
    } 
} 

超類

abstract public class Animal { 

String name; 
int age; 
String noise; 

abstract public void makeNoise(); 

public String getName() { 
     return name; 
    } 

    public void setName(String newName) { 
     name = newName; 
    } 

abstract public Food eat(Food x); 

} 

如何重新寫這篇文章,以使異常正確拋出的任何幫助表示讚賞, 謝謝。

+1

要麼添加throws子句對超或從子類中刪除。 – chrylis

+0

有像堆棧溢出的相關問題太多了,如[Java中的異常和繼承](http://stackoverflow.com/questions/12978798/exception-and-inheritance-in-java) –

回答

-1

由於您應該可以安全地將任何子類替換爲超類型實例,因此無法添加未覆蓋方法的已檢查異常。在這種情況下,您可以將throws Exception添加到您的Animal#eat(Food)方法或從Carnivore中刪除它。

但是,實際上拋出一個簡單的Exception類幾乎總是一個壞主意;有很多具有意義的個人課程。在你的情況下,你應該拋出IllegalArgumentException,當方法調用由於提供的參數不合適而失敗時,這是正確的類型。這是一個未經檢查的異常,不需要throws子句。

請注意,x.equals("Plants")幾乎肯定是檢查的錯誤方法。要麼提供Foodtype()方法返回一個枚舉值,所以x.type() == Foods.PLANTS,或提供一個布爾isPlant()方法,所以x.isPlant()

-1

您必須尊重繼承中的簽名,並且檢查異常是Java中方法簽名的一部分。

由於您沒有定義可能會在您的超類中引發'例外'。食肉動物也不能拋出異常。所以如果你的方法是假設是最終拋出異常的設計 - 在你的超類中定義它也是如此。

另一種可能性是使用適合這種流程的運行時異常。例如,您可以刪除throws Exception並將Exception替換爲illegalArgumentException - 這是一個更適合此目的的Exception。

例子:

public Food eat(Food x) { 
    if (x.equals("Plants")) { 
     throw new IllegalArgumentException("Carnivores only eat meat!"); 
    } else { 
     return x; 
    } 
    } 
+0

*「檢查異常是方法簽名的一部分在Java中「*:https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2 – Tom

0

按你的代碼中已經提到,實現的方法吃(食品X)可以拋出一個異常,這是java.lang.Exception的。此java.lang.Exception是異常層次結構中所有Exception類的超類。所以它除了既檢查也檢查Unchecked異常。根據重寫規則,如果超類方法不會引發任何異常,則在重寫子類中的方法時,可以拋出RunTimeException。

所以按你的代碼晚飯類方法是

抽象的公共食品吃(食品X);

上述方法不拋出任何異常

因此而覆蓋它在子類中,如果你寫下面的代碼,你會得到編譯時異常

公共食品吃(食品X)拋出異常 { //做你的工作 }

但它可以做到如下。

公共食品吃(食品X)拋出的RuntimeException {}

希望你得到了答案。

感謝, 巴桑塔