【问题标题】:Java - Catching multiple exceptions and Identifying which exception occuredJava - 捕获多个异常并确定发生了哪个异常
【发布时间】:2012-03-03 03:00:37
【问题描述】:

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

我遇到了这个问题,我有几种方法可以要求用户输入 3 个Double。 对于每个输入,它检查它是否有效(例如,如果它是一个正值),如果不是,它会抛出一个IllegalArgumentException。现在我创建了一个 Tester 类来检查方法是否正常工作。它应该捕获方法抛出的异常并重新询问用户导致该特定异常的输入。

所有 3 种方法都 throw 和 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
}

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

【问题讨论】:

  • 所以澄清一下,IllegalArgumentException 可能会出现在您的代码中是否还有其他原因?除了“初始值不能为负”之外?我确信有一种更简单的方法,但您始终可以创建自己的异常类,该类继承自 IllegalArgumentException。
  • Ew。试图解析异常消息以识别它是臭的。你对抛出异常的代码有控制权吗,能不能让它抛出一个子异常类型?
  • @prelic 是的,只是稍微扩展了代码以使其更清晰。
  • @LouisWasserman 不幸的是没有:(,我现在只能编辑测试器类。

标签: java exception try-catch illegalargumentexception


【解决方案1】:

由于您无法像在函数式语言中那样匹配 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"));
   }
 }

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @Chris 没错。 在测试器类中这样做。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-19
      • 2010-11-06
      • 2020-05-10
      • 2010-10-03
      • 1970-01-01
      • 2020-04-26
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多