2012-03-03 58 views
-1

我對標題有些困難,不確定如何更準確地說出它。Java - 捕獲多個異常並確定發生了哪個異常

我有這個問題,我有幾種方法要求用戶輸入3 Double。 對於每個輸入它檢查它是否有效(例如,如果它是一個正值),如果它不是它會引發IllegalArgumentException。現在我做了一個Tester類來檢查這些方法是否正常工作。它應該捕獲這些方法拋出的異常,並重新詢問用戶輸入是否導致了特定的異常。

所有3種方法拋出和IllegalArgumentException但錯誤信息是每個不同。無論如何(捕捉異常時)看哪個輸入會導致錯誤?下面是我的代碼示例:

public class account 
{ 
    double value; 
    public account(double initialValue) 
    { 
     if (initialValue < 0) 
     { 
     throw new IllegalArgumentException("Initial value cannot be negative."); 
     } 
     value = initialValue; 
    } 
    public add(double addValue) 
    { 
     if (addValue < 0) 
     { 
     throw new IllegalArgumentException("Added value cannot be negative."); 
     } 
     value = value + addValue; 
    } 
} 

和測試類會是這樣的:

public class accountTester 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
     double initialValue = Double.parseDouble(JOptionPane.showInputDialog("Enter initial value")); 
     account acc = new account(initialValue); 

     double addValue = Double.parseDouble(JOptionPane.showInputDialog("Enter value to add")); 
     acc.add(addValue); 
     } catch (Exception e) { 
     System.out.println("Wrong ammount"); 
     initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount")); 
    } 
} 

那麼我會在測試類改爲拋出代碼只有在IllegalArgumentException是「初始值不能是負值。」

對不起,如果我讓這很難理解。

編輯:據我的教授,我們應該用做

String error = e.toString; 
if (error.contains("Added value cannot be negative.") 
{ 
    //DO CODE FOR FIRST ERROR 
} 

我知道這是不是雖然這樣做的最正確的方法。

+0

因此,澄清,是否有其他原因'IllegalArgumentException'可能會在您的代碼中拋出?除了「初值不能爲負」?我確定有一個更簡單的方法,但是你總是可以創建自己的異常類,它繼承自IllegalArgumentException。 – prelic 2012-03-03 03:03:45

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/Throwable。'getMessage()' – 2012-03-03 03:04:00

+1

Ew。嘗試解析異常消息以識別它是很臭的。你是否可以控制拋出異常的代碼,並且可以讓它拋出一個子異常類型? – 2012-03-03 03:05:29

回答

0

使用自己的try/catch塊環繞每個方法調用?

+0

我只能編輯測試人員班級:( – Chris 2012-03-03 03:08:42

+1

@Chris正是。在測試程序類中做*。* – EJP 2012-03-03 09:04:41

2

既然你不能匹配在Strings就像你在,你必須提供三種不同類型的對象,如果你希望能夠使用的try-catch機制來區分它們的功能語言做。

或者使用簡化的方法將一個參數附加到異常,以便您只能使用catch子句,但行爲可能不同。喜歡的東西

class MyIllegalArgumentException extends IllegalArgumentException { 
    public int whichParameter; 

    public MyIllegalArgumentException(String string, int which) { 
    super(string); 
    whichParameter = which; 
    } 
} 

現在,您可以:

catch (MyIllegalArgumentException e) { 
    if (e.whichParameter == 0) 
    .. 
    else if (e.whichParameter == 1) 
    .. 
} 

你也可以檢查平等字符串但這真的不是一個很好的設計選擇,你也可以有很多的try-catch塊但這並非總是可行。

已經擴大了您的代碼後的解決方案很簡單:

public static void main(String[] args) { 
    try { 
    double initialValue = ... 
    account acc = new account(initialValue); 
    } catch (IllegalArgumentException e) { 
    ... 
    } 

    try {  
    double addValue = ... 
    acc.add(addValue); 
    } catch (Exception e) { 
     System.out.println("Wrong ammount"); 
     initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount")); 
    } 
} 
0

在你的catch塊你應該只趕上IllegalArgumentException異常。那麼你可以做的是調用getMessage()函數,這將使你能夠做一個非常簡單的String.equals調用。