-1

我对标题有一些困难,不知道如何更准确地表达它。

我遇到了这个问题,我有几种方法要求用户输入 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
}

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

4

3 回答 3

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"));
   }
 }
于 2012-03-03T03:07:26.473 回答
0

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

于 2012-03-03T03:37:32.187 回答
0

用自己的 try/catch 块包围每个方法调用?

于 2012-03-03T03:05:58.083 回答