[英]How to fix loop while/try catch error in java
我正在创建一个简单的计算器程序(这个 Java 编程的第一周)。
问题背景:只有 5 个选项有效。 (1-加;2-减;3-乘;4.除;5.退出)。 当用户输入 1-4 选项时,结果将填充,但用户需要循环返回以重新输入数据,直到选择选项 5。 5是退出程序(结束循环/程序的唯一方法)。 我的问题: 1. 如何阻止 try-catch 不停地运行? 有没有更好的方法来实现try-catch? 例如,处理字符串数据错误消息。理想情况下,如果输入了字符串,代码应该循环返回以通过生成消息“请重新输入数字...”来重新启动,直到用户输入有效数字 2. 我正在尝试在主类中使用尽可能多的静态方法。 我不确定我做的方式是否准确?
这是我输入的代码:
12 2
//-everything works well.
2 //-enter again
s s (string entry-error)
然后,将填充以下消息:
"You have entered invalid floats. please re-enter:
Exception in thread "main" java.util.InputMismatchException
...
at calculator.performSubtract(calculator.java:65)
at calculator.main(calculator.java:34)"
代码(示例)
public class calculator {
//use static methods to implement the program
static Scanner userInput = new Scanner(System.in);
static int userChoice;
static float numberOne;
static float numberTwo;
static float answer;
static int choice;
public static void main(String[] args) {
do {
//this menu statement has to be repeated unless 5 is entered (exit the
//program)
System.out.println("Welcome to <dj's> Handy Calculator\n\n\t \1. Addition \n\t 2. Subtraction\n\t 3. Multiplication\n\t 4. Division\n\t 5. Exit\n\n");
System.out.print("What would you like to do? ");
try {
choice = userInput.nextInt();
}catch (InputMismatchException e) {
continue;
}
switch (choice) {
case 2: performSubtract();
break;
...
case 5: exit();
break;
}
}while(choice >0 && choice <5);
userInput.close();
}
public static void performSubtract () {
//catch error statement.
try {
numberOne = userInput.nextFloat();
numberTwo= userInput.nextFloat();
answer= numberOne-numberTwo;
} catch (Exception e) {
System.out.println("You have entered invalid floats. please re-enter: ");
numberOne = userInput.nextFloat();
numberTwo= userInput.nextFloat();
}
System.out.printf("Please enter two floats to subtraction, separated by a space: %.1f %.1f\n", numberOne, numberTwo);
System.out.printf("Result of subtraction %.1f and %.1f is %.1f\n", numberOne, numberOne, answer);
System.out.println("\nPress enter key to continue...");
}
}
我认为问题在于您没有从扫描仪中清除问题令牌。 您的 catch 语句会打印一条错误消息,然后继续尝试将相同的标记再次解析为 int 或 float。
您可以在这里查看: https : //www.geeksforgeeks.org/scanner-nextint-method-in-java-with-examples/
看起来您需要调用userInput.next()
才能超越无效令牌。
此外,如果您愿意,hasNextInt() 将让您完全避免捕获。
对于第一个问题:try-catch 块通常用于查看您的代码是否运行无误。 通过你解释一下你正在尝试做的,我会改为使用while循环赋值为之前numberOne
和numberTwo
输入是否浮动或不喜欢:
// pseudo
while(input != float || input2 != float)
{
print(please reenter)
}
numberOne = input
numberTwo = input2
您的错误在于Scanner.nextFloat
在读取无效输入时不会推进当前标记。 这意味着当您在 catch 语句中再次调用nextFloat
两次时,您将再次读取标记s
和s
,其中第一个将导致再次抛出 InputMismatchException 。 您应该将performSubtract
方法更改为如下所示:
public static void performSubtract () {
//catch errors
System.out.println("Please enter two floats to subtraction, separated by a space");
userInput.nextLine();//ignore the new line
do {
try {
String[] nextLineTokens = userInput.nextLine().split("\\s+");
if(nextLineTokens.length != 2)
{
System.out.println("You have not entered two floats. please re-enter:");
continue;
}
numberOne = Float.parseFloat(nextLineTokens[0]);
numberTwo = Float.parseFloat(nextLineTokens[1]);
answer= numberOne-numberTwo;
break;
}
catch (Exception e) {
System.out.println("You have entered invalid floats. please re-enter: ");
}
} while (true);
System.out.printf("You entered: %.1f %.1f\n", numberOne, numberTwo);
System.out.printf("Result of subtraction %.1f minus %.1f is %.1f\n", numberOne, numberTwo, answer);
System.out.println("\nPress enter key to continue...");
userInput.nextLine();
}
此外,如果您输入无效的输入,您的解析代码会继续,但如果您输入的数字不是 1-5,则会退出。 如果这是您第一次读入输入,代码也会因无效输入而退出。 您可能应该像这样更改解析迭代循环:
public static void main(String[] args) {
while(choice != 5) {
//this menu statement has to be repeated unless 5 is entered (exit the
//program)
System.out.println("Welcome to <dj's> Handy Calculator\n\n\t 1. Addition \n\t 2. Subtraction\n\t 3. Multiplication\n\t 4. Division\n\t 5. Exit\n\n");
System.out.print("What would you like to do? ");
try {
choice = userInput.nextInt();
}
catch (InputMismatchException e) {
userInput.next();
continue;
}
switch (choice) {
case 2: performSubtract();
break;
// ...
case 5: exit();
break;
}
}
userInput.close();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.