2012-10-08 84 views
0

創建一個新的異常類IllegalDimensionException,它擴展了Exception類。這將有兩個構造函數,一個默認 - 價值和一個明確的值,它使用消息「非法的尺寸爲您指定的身影。新的異常類擴展異常類,並有兩個構造函數

這似乎是這樣做的正確的方式??

public class IllegalDimensionException extends Exception { 
    String message; //the message that will be used 
    String Eplicitm = "Illegal dimension for the figure you specified"; 

    //constructor one 
    public IllegalDimensionException (String m){ 
     m = message; 
    } 
    //constructor two 
    public IllegalDimensionException(String E){ 
     E = Eplicitm; 

    } 
    public static void main(String[] args){ 
     return E; 
    } 

} 

我有麻煩創建兩個構造函數沒有一個是無效的任何建議,我怎麼才能得到這個正確的工作?

+1

你回答勉強的例外問題是有道理的。你可以確保你從任何你正在從事的書/講座中正確地複製它。 –

回答

0

構造函數不應該有返回類型,所以你的第二個「構造函數」不是實際的構造函數,而是它是方法與像名字一樣的構造函數,我想知道爲什麼它沒有給你任何錯誤,因爲你不ret從這裏收集任何東西。 如果你只是從第二個移除void,它將不起作用,因爲這兩個構造函數都會有相同類型的參數,所以不會被重疊的consturctor,而是重複的。在這種情況下,您將再次遇到錯誤。 請看看這個鏈接,你的問題真正的答案,How to define custom exception class in Java, the easiest way?

0

任何兩個構造函數(或任何與此有關的方法)必須有一個不同的方法指紋(又名簽字)。指紋包括;

  • 方法名
  • 該方法返回類型
  • 方法參數(按類型)

您正在試圖創建具有相同的指紋,這是不允許的兩個構造。畢竟,編譯器如何知道你想要調用哪種方法?

作爲一個側面說明;你的代碼變得毫無意義:

public IllegalDimensionException (String m){ 
    m = message; 
} 

字面上沒有效果,你與你的實例變量message覆蓋局部變量m的價值......我只能假設你的意思周圍做這個的其他方式?

0

也許類似的東西,回答你的問題:

public IllegalDimensionException (String m) { 
    super(m); // you may use the exception message member instead of defining yours 
    message = m; 
} 

public IllegalDimensionException(){ 
    this(Eplicitm); 
} 

因此,你真的有兩個構造函數:一個默認值和一個自定義消息。 如果這是你所期望的,Eplicitm應該是一個常量(靜態最終)。

+0

這不是你將如何實現一個自定義異常(其中調用'super()'?)。另外,你還在實例字段'message'上寫入參數'm'。 –

+0

你是對的我只是複製第一個構造函數的代碼。我更新了它。 – mkhelif

0

這個可能是你在找什麼。你所回答的問題是,目前還不清楚,所以我不知道:

public final class IllegalDimensionException extends Exception { 
    private static final String DEFAULT = 
     "Illegal dimension for the figure you specified"; 

    //constructor one 
    public IllegalDimensionException(){ 
    super(DEFAULT); 
    } 

    //constructor two 
    public IllegalDimensionException(String message){ 
    super(message); 
    } 
} 

super()使用正確傳遞異常消息給超類。

0

它將有兩個構造函數,一個默認值和一個顯式值,它使用消息「Illegal dimension」指定的圖形。

這聽起來像你真正需要你的兩個構造函數是一個默認(無參數),以及一個接受String參數。例如,

public IllegalDimensionException() { 
    super(Eplicitm); 
} 

public IllegalDimensionException(String m) { 
    message = m; 
} 

super()調用默認構造函數會調用Exception的構造函數,它接受一個String,並通過你的Eplicitm它。

然而,你正在你的代碼片段的邏輯有幾個基本的缺陷以上,我想向你指出:

  1. 你不能指定一個構造函數的超額收益類型(如你在你的「構造函數2」中使用public void IllegalDimensionException)。這是因爲IllegalDimensionException本質上是返回類型,因爲您正在使用它創建對象的新實例。您的上述簽名將改爲創建一個名爲IllegalDimensionException的新方法,該方法返回void,並且必須由此例外的實例調用...所以您基本上已經創建了一個過於複雜(格式錯誤)名稱的setter方法。

  2. 對於Exception有一個main(String[])方法沒有意義。 A main()本質上是整個程序的啓動開始,而Exception是在出現問題時創建的東西之內的程序。當你創建更復雜的項目時,你會希望保持每個類的功能從根本上分離,獨特和合乎邏輯。

  3. 一個常量,例如默認值應該被聲明爲private static final。如您的代碼所示,任何可獲取IllegalDimensionException實例的代碼都可以通過簡單地撥打theException.Eplicitm = "Yo yo yo, wassup."來更改默認消息。不是一個非常有用的錯誤消息。這是因爲變量的默認隱私是public。幸運的是,你還沒有聲明它爲static,所以這樣的改變只會影響一個例外......但是更好的做法是在創建的所有可能的例外中只有一個不可變的版本。

  4. 變量名稱應該是駱駝大小寫(variableName),而類名稱應以全部大寫字母(MyClass)開頭。常量應該全部大寫,下劃線爲分隔符(MY_CONSTANT_VALUE)。

上面的一些可能聽起來很挑剔,但事實並非如此。上述所有內容都會在你的代碼中隱藏漏洞(其中一些非常危險),或者使你的代碼更具可讀性(你會發現這是一個很大的好處 - 因爲即使你會忘記爲什麼你寫了一段當你三個月後回去查看代碼時)。例如,我確定我不是唯一一位專業程序員花了一段時間來弄清楚Eplicitm(除拼寫外)的含義,因爲它看起來像一個複雜的自定義對象的名稱。 。不是String