Java - 捕获多个异常并识别发生的异常

时间:2012-03-03 03:00:38

标签: java exception try-catch illegalargumentexception

我对标题有些困难,不确定如何更准确地说出来。

我遇到了这个问题,我有几种方法要求用户输入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为“初始值不能为负数”时,我才需要在测试者类中更改以抛出该代码。

很抱歉,如果我难以理解的话。

编辑:根据我的教授,我们应该使用do

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

我知道这不是最合适的做法。

3 个答案:

答案 0 :(得分:2)

由于您无法像在函数式语言中那样匹配Strings,因此如果您希望能够使用 try-catch <区分它们,则必须提供三种不同类型的对象。 / em> mechanics。

或者使用简化方法将参数附加到异常,这样您就可以只使用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"));
   }
 }

答案 1 :(得分:0)

使用自己的try / catch块围绕每个方法调用吗?

答案 2 :(得分:0)

在catch块中,您应该只捕获IllegalArgumentException。然后你可以做的是调用getMessage()函数,这将使你能够进行一个非常简单的String.equals调用。