简体   繁体   English

如何在java中修复循环while/try catch错误

[英]How to fix loop while/try catch error in java

I am working on creating a simple calculator program (first week into this java programming).我正在创建一个简单的计算器程序(这个 Java 编程的第一周)。

problem background: only 5 options are valid.问题背景:只有 5 个选项有效。 (1-add; 2- subtract; 3- multiple;4. divide; and 5.exit). (1-加;2-减;3-乘;4.除;5.退出)。 when users enter 1-4 options, results will populate but users need to loop back to reenter data till option 5 is selected.当用户输入 1-4 选项时,结果将填充,但用户需要循环返回以重新输入数据,直到选择选项 5。 5 is to exit the program(the only way to end the loop/program). 5是退出程序(结束循环/程序的唯一方法)。 my questions: 1. how to stop try-catch from running nonstop?我的问题: 1. 如何阻止 try-catch 不停地运行? is there a better way to implement try-catch?有没有更好的方法来实现try-catch? eg, handling string data error messages.Ideally, if a string is entered, the code should loop back to restart again by producing the message "please reenter the number..." until a valid number is entered by users 2. I am trying to use as many static methods as possible in the main class.例如,处理字符串数据错误消息。理想情况下,如果输入了字符串,代码应该循环返回以通过生成消息“请重新输入数字...”来重新启动,直到用户输入有效数字 2. 我正在尝试在主类中使用尽可能多的静态方法。 i am not sure whether the way I did was accurate?我不确定我做的方式是否准确?

Here is the code I input:这是我输入的代码:

    12 2 
    //-everything works well.
    2 //-enter again 
    s s (string entry-error) 

then, the below message populates:然后,将填充以下消息:

    "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)" 

code(sample)代码(示例)

   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...");
    }

}

I believe the issue is that you are not clearing the problem token from the scanner.我认为问题在于您没有从扫描仪中清除问题令牌。 Your catch statement prints an error message, and then goes around to try and parse the same token into an int or float again.您的 catch 语句会打印一条错误消息,然后继续尝试将相同的标记再次解析为 int 或 float。

You might check here: https://www.geeksforgeeks.org/scanner-nextint-method-in-java-with-examples/您可以在这里查看: https : //www.geeksforgeeks.org/scanner-nextint-method-in-java-with-examples/

It looks like you need to call userInput.next() to advance past the invalid token.看起来您需要调用userInput.next()才能超越无效令牌。

Also, hasNextInt() will let you avoid the catch altogether if you prefer.此外,如果您愿意,hasNextInt() 将让您完全避免捕获。

To the first question: try-catch block are usually used to see if your code are running through without error.对于第一个问题:try-catch 块通常用于查看您的代码是否运行无误。 By what you explain what you are trying to do, I would instead use a while-loop before the assignment for numberOne and numberTwo whether the input was float or not like:通过你解释一下你正在尝试做的,我会改为使用while循环赋值为之前numberOnenumberTwo输入是否浮动或不喜欢:

// pseudo

while(input != float || input2 != float)
{
  print(please reenter)
}
numberOne = input
numberTwo = input2

Your error lies in the fact that Scanner.nextFloat , when reading an invalid input, does not advance the current token.您的错误在于Scanner.nextFloat在读取无效输入时不会推进当前标记。 This means that when you call nextFloat twice again in the catch statement, you once again read the tokens s and s , the first of which will cause an InputMismatchException to be thrown once again.这意味着当您在 catch 语句中再次调用nextFloat两次时,您将再次读取标记ss ,其中第一个将导致再次抛出 InputMismatchException 。 You should change your performSubtract method to look something like this:您应该将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();
}

Additionally, your parsing code continues if you enter an invalid input, but exits if you type in a number that is not 1-5.此外,如果您输入无效的输入,您的解析代码会继续,但如果您输入的数字不是 1-5,则会退出。 If it is the first time that you read in input, the code exits for invalid inputs as well.如果这是您第一次读入输入,代码也会因无效输入而退出。 You should probably change your parse iteration loop as so:您可能应该像这样更改解析迭代循环:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM