【问题标题】:Java: How To Call Previous Method After Swallowing ExceptionJava:吞下异常后如何调用上一个方法
【发布时间】:2017-02-16 06:09:39
【问题描述】:

我正在编写一些 Java 代码,如果发现异常,我想循环回之前的方法。

这是我的代码的简化版

public class classA
{

   public static void main(String[] args)
   {
      int number1 = askUserForFavoriteSum();
      int number2 = askUserForAnotherNumber();
   }

    public static int askUserForFavoriteSum()
    {
        int firstFavorite;
        int secondFavorite;
        int favoriteSum

        System.out.println("What is your first favorite number?");
        firstFavorite = classB.getIntFromConsole();
        System.out.println("What is your second favorite number?");
        secondFavorite = classB.getIntFromConsole();

        favoriteSum = firstFavorite + secondFavorite;
        return favoriteSum;
    }

    public static int askUserForAnotherNumber()
    {
        int number;
        System.out.println("What is another number?");
        number = classB.getIntFromConsole();
        return number;
    }

}

public class classB
{
    public static int getIntFromConsole()
    {
        Scanner scanner = new Scanner(System.in)
        int value;

        try
        {
            value = Integer.valueOf(scanner.nextLine());
        }
        catch (NumberFormatException e) //Occurs when the input string cannot cleanly be converted to an int.
        {
            System.out.println("ERROR: Invalid input! Please enter a whole number.");
        }
        return value;
    }
}

例如,给定上面的两个类,我希望发生以下情况:

  1. askUserForFavorite 方法被执行。
  2. 当提示输入他们的第一个喜欢的号码时,用户输入“Potatoe”。因此,会发生 NumberFormatException。
  3. “错误:输入无效!请输入一个整数。”打印到 控制台。
  4. askUserForFavorite 方法被执行(再次)。 这就是我正在努力解决的问题。
  5. 当提示输入收藏号码时,用户输入“2”。因此,没有 发生异常。

在做了一些研究之后,我看到很多人选择Strategy Design Pattern,但是,这并不适合我,因为我的 classA 方法中有动态变量,而接口不能很好地处理动态变量。

在其他情况下,一些开发人员将“Callable ”参数传递给他们等效的“getIntFromConsole”方法,并调用反映传入方法的未来方法。这种方法似乎可行,但它需要我添加一个新的抽象层。

有没有一种方法可以简单地从 classA 中调用之前调用 getIntFromConsole 方法的方法,而无需添加抽象层或接口?

【问题讨论】:

  • 使用while循环(即while (invalid) { askForIt }
  • 你可以让getIntFromConsole进一步抛出NumberFormatException(可能将它包装成更合适的Exception),在main中捕获它,然后重试(例如使用循环)。

标签: java exception abstraction strategy-pattern


【解决方案1】:

改成循环就好了

public static int getIntFromConsole()
{
    Scanner scanner = new Scanner(System.in)
    int value;

    while (true) {
      try
      {
          value = Integer.valueOf(scanner.nextLine());
          break;
      }
      catch (NumberFormatException e) 
      {
         System.out.println("ERROR: Invalid input! Please enter a whole number.");
      }
    }
    return value;
}

【讨论】:

  • 从逻辑上讲,这种方法似乎很合理......让我在我的实际代码中尝试一下(不是我在问题中包含的愚蠢示例),看看它的效果如何。如果可行,我会接受这个答案。无论如何,感谢您的解决方案。
  • 我是 KISS 的坚定支持者
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多