2012-03-03 59 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调用。