【发布时间】: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;
}
}
例如,给定上面的两个类,我希望发生以下情况:
- askUserForFavorite 方法被执行。
- 当提示输入他们的第一个喜欢的号码时,用户输入“Potatoe”。因此,会发生 NumberFormatException。
- “错误:输入无效!请输入一个整数。”打印到 控制台。
- askUserForFavorite 方法被执行(再次)。 这就是我正在努力解决的问题。
- 当提示输入收藏号码时,用户输入“2”。因此,没有 发生异常。
在做了一些研究之后,我看到很多人选择Strategy Design Pattern,但是,这并不适合我,因为我的 classA 方法中有动态变量,而接口不能很好地处理动态变量。
在其他情况下,一些开发人员将“Callable ”参数传递给他们等效的“getIntFromConsole”方法,并调用反映传入方法的未来方法。这种方法似乎可行,但它需要我添加一个新的抽象层。
有没有一种方法可以简单地从 classA 中调用之前调用 getIntFromConsole 方法的方法,而无需添加抽象层或接口?
【问题讨论】:
-
使用while循环(即
while (invalid) { askForIt }) -
你可以让
getIntFromConsole进一步抛出NumberFormatException(可能将它包装成更合适的Exception),在main中捕获它,然后重试(例如使用循环)。
标签: java exception abstraction strategy-pattern