为什么我的Java计算器暂停?

时间:2015-03-13 12:30:21

标签: java

calculator()运行后,我的程序暂停...除非我输入一个输入以取消暂停程序。然后它继续运行并打印出来。但是,我之前输入的用于取消暂停程序的输入存储在answer中。请阅读我在代码中的评论以便更好地理解。如果你仍然不明白,那么随意复制代码,看看我在说什么。

public static void main(String[] args) {
    boolean repeat = true;
        while (repeat){
            calculator(); //-Program pauses after this has ran.
            System.out.println("Do you wish to repeat(y/n)?"); // This does not appear unless I enter an input.
            String answer = userInput.next(); //The input that I entered earlier to unpause the program gets stored into answer.

                if (answer.equalsIgnoreCase("y")){ 
                    repeat = true;
                } else { repeat = false;}}} //Program terminates here because the input that I used to unpause the program isn't "y".

以下完整代码:

package calculatorAttempt;
import java.util.Scanner;

class CalculatorV2 {
    static Scanner userInput = new Scanner(System.in);

public static void calculator(){

    System.out.print(":");

    if (userInput.hasNextInt()){
        int num1 = userInput.nextInt();
        System.out.print(":");
        String inString = userInput.next();
        System.out.print(":");
        int num2 = userInput.nextInt();
        System.out.print("=");

            if (inString.equals("+")){
                System.out.print(num1+num2);}

            if (inString.equals("-")){
                System.out.print(num1-num2);}

            if (inString.equals("*")||(inString.equalsIgnoreCase("x"))){
                System.out.print(num1+num2);}

            if (inString.equals("/")){
                float intTofloat = (float)num1/num2;
                System.out.println(intTofloat);}    }//If Integer


    if (userInput.hasNextFloat()){
        float num1 = userInput.nextFloat();
        System.out.print(":");
        String inString = userInput.next();
        System.out.print(":");
        float num2 = userInput.nextFloat();
        System.out.print("=");

            if (inString.equals("+")){
                System.out.print(num1+num2);}

            if (inString.equals("-")){
                System.out.print(num1-num2);}

            if (inString.equals("*")||(inString.equalsIgnoreCase("x"))){
                System.out.print(num1*num2);}

            if (inString.equals("/")){
                System.out.print(num1/num2);}   }//If Float
}//Public Void Calculator

public static void main(String[] args) {
    boolean repeat = true;
        while (repeat){
            calculator();   
            System.out.println("Do you wish to repeat(y/n)?");
            String answer = userInput.next();


                if (answer.equalsIgnoreCase("y")){
                    repeat = true;
                } else { repeat = false;}}
     }//Main
}//Class

我是初学者所以请耐心等待我:^)。感谢。

3 个答案:

答案 0 :(得分:3)

这是因为这一行:

if (userInput.hasNextFloat()){

hasNext...()中的Scanner方法是阻止方法。如果扫描仪中没有除空白区域之外的输入,则会阻止它们等待输入某些内容。一旦输入真实的东西(不是空格或换行符),它们就会检查它是浮点数,整数或其他什么,并返回一个真/假的回复。

完成整数计算后,程序会调用hasNextFloat(),因此会阻塞,等待您输入内容。如果那个东西不是浮点数,它将返回false,if将不起作用。

您可以尝试一下,看看:

  • 如果您运行程序并以浮点数(例如17.2)开头,程序会在计算结果后显示Do you wish to repeat?个问题。
  • 如果您运行程序并以int开头,然后在得到结果后输入一个浮点数,它将打印要求您运行浮点运算符的:

所以基本上,这不应该是if。它应该是else if结构。

答案 1 :(得分:0)

只需使用else if代替if来检查userInput.hasNextFloat()。

您的代码示例将如下所示。

if (userInput.hasNextInt()){
        int num1 = userInput.nextInt();
        ....
        ....
        ....

    } else if (userInput.hasNextFloat()){
        float num1 = userInput.nextFloat();
        ....
        ....
        ...
    }

答案 2 :(得分:-1)

您必须使用hasNext()代替hasNextInt()并删除if(hasNextFloat())部分。并使用Number类,因为它同时接受整数和浮点数:

if (userInput.hasNext()) {
    Number num1 = userInput.nextByte();
    System.out.print(":");
    String inString = userInput.next();
    System.out.print(":");
    Number num2 = userInput.nextByte();
    System.out.print("=");

    switch (inString) {
        case "+":
            System.out.print(num1.doubleValue() + num2.doubleValue());
            break;

        case "-":
            System.out.print(num1.doubleValue() - num2.doubleValue());
            break;

        case "*":
        case "x":
        case "X":
            System.out.print(num1.doubleValue() * num2.doubleValue());
            break;

        case "/":
            double intTofloat = num1.doubleValue() / num2.doubleValue();
            System.out.println(intTofloat);
            break;

        default:
            System.out.println(INVALID OPERATOR!);
            break;
    }
}