while循环在验证字符串是否为double时打印一行两次(基本计算器)

时间:2018-03-31 14:02:21

标签: java

我在基本计算器上编写作业,我的代码似乎很完美,但它有一个错误。

import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in); // Define new Scanner

    String answer = "yes";
    double finalValue;

    while (answer.equalsIgnoreCase("Yes")) {

    System.out.print("Enter First Number: ");
    String firstNumber = scanner.next(); // Define first number, and ask user for input

    while (!firstNumber.matches("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")) {
        System.out.print("Please enter number only: ");
        firstNumber = scanner.nextLine();
    }

    System.out.print("Enter an operator (+, -, / or *): ");
    char operator = scanner.next().charAt(0);

    System.out.print("Enter Second Number: ");
    String secondNumber = scanner.next();

    while (!secondNumber.matches("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")) {
        System.out.print("Please enter number only: ");
        secondNumber = scanner.nextLine();
    }

    switch(operator) {
    case '+':
        finalValue = Double.parseDouble(firstNumber) + Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '-':
        finalValue = Double.parseDouble(firstNumber) - Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '*':
        finalValue = Double.parseDouble(firstNumber) * Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '/':
        if(secondNumber.equals("0")) {
            System.out.println("a number can not be divided by 0.");
        } else {
        finalValue = Double.parseDouble(firstNumber) / Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        }
        break;
    default:
        System.out.println("Operator entered incorrectly.");
        break;
    }

    System.out.print("Do you want another operation? (type yes to continue): ");
    answer = scanner.next();

    }

    System.out.println("Bye.");


}
}

当我编译它并在firstNumber或secondNumber中输入一些单词而不是数字时,它输出"请仅输入数字:"第一次两次,然后一次。我尽力解决它,但我不能请求帮助:(

3 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您在scanner.nextLine();

之后使用了scanner.next();

尝试按以下方式添加空白声明以避免此问题:

scanner.nextLine();

OR

scanner.nextLine()替换为scanner.next()

之后正在努力。请参考以下内容:

class Calculator {
    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in); // Define new Scanner

    String answer = "yes";
    double finalValue;

    while (answer.equalsIgnoreCase("Yes")) {

    System.out.print("Enter First Number: ");
    String firstNumber = scanner.next(); // Define first number, and ask user for input

    while (!firstNumber.matches("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")) {
        System.out.print("Please enter number only: ");
        firstNumber = scanner.next();
    }

    System.out.print("Enter an operator (+, -, / or *): ");
    char operator = scanner.next().charAt(0);

    System.out.print("Enter Second Number: ");
    String secondNumber = scanner.next();

    while (!secondNumber.matches("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")) {
        System.out.print("Please enter number only: ");
        secondNumber = scanner.nextLine();
    }

    switch(operator) {
    case '+':
        finalValue = Double.parseDouble(firstNumber) + Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '-':
        finalValue = Double.parseDouble(firstNumber) - Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '*':
        finalValue = Double.parseDouble(firstNumber) * Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        break;
    case '/':
        if(secondNumber.equals("0")) {
            System.out.println("a number can not be divided by 0.");
        } else {
        finalValue = Double.parseDouble(firstNumber) / Double.parseDouble(secondNumber);
        System.out.println(finalValue);
        }
        break;
    default:
        System.out.println("Operator entered incorrectly.");
        break;
    }

    System.out.print("Do you want another operation? (type yes to continue): ");
    answer = scanner.next();

    }

    System.out.println("Bye.");


}
}

enter image description here

但是从未来的角度来看,最好的选择是扫描预期的数据类型,如scanner.nextInt()或scanner.nextDouble()

答案 1 :(得分:0)

我建议您每次都使用scanner.next()解决此问题,不要使用scanner.nextDouble()。我重写了你的代码并且它现在正在工作。我可以问你为什么不使用import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Define new Scanner String answer = "yes"; double finalValue; while (answer.equalsIgnoreCase("Yes")) { System.out.print("Enter First Number: "); Double firstNumber = null; while (firstNumber == null) { try { firstNumber = Double.valueOf(scanner.nextLine()); } catch (NumberFormatException ex) { System.out.println("Please enter number only."); } } System.out.print("Enter an operator (+, -, / or *): "); String line = null; while (line == null || line.length() == 0) { line = scanner.nextLine(); } char operator = line.charAt(0); System.out.print("Enter Second Number: "); Double secondNumber = null; while (secondNumber == null) { try { secondNumber = Double.valueOf(scanner.nextLine()); } catch (NumberFormatException ex) { System.out.println("Please enter number only."); secondNumber = null; scanner.reset(); } } switch(operator) { case '+': finalValue = firstNumber + secondNumber; System.out.println(finalValue); break; case '-': finalValue = firstNumber - secondNumber; System.out.println(finalValue); break; case '*': finalValue = firstNumber * secondNumber; System.out.println(finalValue); break; case '/': if(secondNumber == 0d) { System.out.println("a number can not be divided by 0."); } else { finalValue = firstNumber / secondNumber; System.out.println(finalValue); } break; default: System.out.println("Operator entered incorrectly."); break; } System.out.print("Do you want another operation? (type yes to continue): "); answer = scanner.next(); } System.out.println("Bye."); } } ?无论如何,请参阅下面的代码。

{{1}}

答案 2 :(得分:0)

您需要将firstNumber = scanner.nextLine();替换为firstNumber = scanner.next();,将secondNumber = scanner.nextLine();替换为secondNumber = scanner.next();