Java 为什么这段代码不允许我在完成计算器类后输入命令?

Java 为什么这段代码不允许我在完成计算器类后输入命令?,java,Java,我正在尝试制作一个简单的基于文本的操作系统,我不明白为什么我的代码不允许我在计算器类完成后输入命令。它应该继续执行代码,直到我键入“off”,但事实并非如此。Eclipse说它正在运行,但我什么也做不了。有人能帮我吗 这是我的两门课: public class Calculator extends Start{ public static void calStrt() { System.out.print("\nEnter operator you wish to use: ");

我正在尝试制作一个简单的基于文本的操作系统,我不明白为什么我的代码不允许我在计算器类完成后输入命令。它应该继续执行代码,直到我键入“off”,但事实并非如此。Eclipse说它正在运行,但我什么也做不了。有人能帮我吗

这是我的两门课:

public class Calculator extends Start{

public static void calStrt() {

    System.out.print("\nEnter operator you wish to use: ");
    StringInput = scan.nextLine();

    if (StringInput.equals("+")) {

        add();

    } else if (StringInput.equals("-")) {

        sub();

    } else if (StringInput.equals("*")) {

        mul();

    } else if (StringInput.equals("/")) {

        div();

    } else {

        System.out.println("\nSyntax error: Operator not recognized");
        System.out.println("Please try again");
        calStrt();

    }

}

public static void add() {

    System.out.print("\nEnter first number: ");
    intInput = scan.nextInt();
    int intVar1 = intInput;

    System.out.print("\nEnter second number: ");
    intInput = scan.nextInt();
    int intVar2 = intInput;

    System.out.println("\nAnswer: " + (intVar1 + intVar2));

}

public static void sub() {

    System.out.print("\nEnter first number: ");
    intInput = scan.nextInt();
    int intVar1 = intInput;

    System.out.print("\nEnter second number: ");
    intInput = scan.nextInt();
    int intVar2 = intInput;

    System.out.println("\nAnswer: " + (intVar1 - intVar2));

}

public static void mul() {

    System.out.print("\nEnter first number: ");
    intInput = scan.nextInt();
    int intVar1 = intInput;

    System.out.print("\nEnter second number: ");
    intInput = scan.nextInt();
    int intVar2 = intInput;

    System.out.println("\nAnswer: " + (intVar1 * intVar2));

}

public static void div() {

    System.out.print("\nEnter first number: ");
    intInput = scan.nextInt();
    int intVar1 = intInput;

    System.out.print("\nEnter second number: ");
    intInput = scan.nextInt();
    int intVar2 = intInput;

    System.out.println("\nAnswer: " + (intVar1 / intVar2));

}

}




import java.util.Scanner;

class Start {

static Scanner scan = new Scanner(System.in);
static String StringInput;
static int intInput;

public static void main(String[] args) {

    System.out.println("\nWelcome to RobOS");

    passLoop: while (true) {

        System.out.print("\nPlease enter password: ");
        StringInput = scan.nextLine();

        if (StringInput.equals("banana")) {

            System.out.print("Logging in, please wait");
            System.out.print(".");
            System.out.print(".");
            System.out.println(".");

            System.out.println("\nWelcome User");

            outerLoop: while (true) {

                System.out.println("\nType \"help\" to see a list of programs");

                StringInput = scan.nextLine();  

                innerLoop: while (true) {

                    if (StringInput.equalsIgnoreCase("cal")) {

                        Calculator.calStrt();
                        continue outerLoop;

                    } else if (StringInput.equalsIgnoreCase("guess")) {

                        GuessGame.guess();
                        continue outerLoop;

                    } else if (StringInput.equalsIgnoreCase("help")) {

                        System.out.println("\n\"cal\" uses the calculator");
                        System.out.println("\"guess\" plays guessing game");
                        System.out.println("\"help\" shows list of programs");
                        System.out.println("\"off\" turns RobOS off");
                        continue outerLoop;

                    } else if (StringInput.equalsIgnoreCase("off")){

                        break passLoop;

                    } 

                }

            }

        } else { 

            System.out.println("\nWrong password. Please try again");
            continue passLoop;

        }

    }

}

}

您的代码正在进入一个无限循环。当您调用
StringInput=scan.nextLine()
时,它第一次工作正常。我输入了
cal
,可以运行计算器一次。问题是第二次调用
scan.nextLine()
时,它会自动返回一个空字符串“”,作为
StringInput
的值。
while(true)
中的一组
if/else
语句无法处理此问题,因此它只能永远循环


更深层次的理由是调用
scan.nextInt()
来读取数字,但问题是当您为计算器操作读取第二个数字时,
系统中仍有一个“\n”。因此,当您循环并再次调用
scan.nextLine()
时,它不会提示您输入任何内容,因为它只会读取仍位于
系统中的“\n”,然后将您送入无限循环。

您的代码正在进入无限循环。当您调用
StringInput=scan.nextLine()
时,它第一次工作正常。我输入了
cal
,可以运行计算器一次。问题是第二次调用
scan.nextLine()
时,它会自动返回一个空字符串“”,作为
StringInput
的值。
while(true)
中的一组
if/else
语句无法处理此问题,因此它只能永远循环


更深层次的理由是调用
scan.nextInt()
来读取数字,但问题是当您为计算器操作读取第二个数字时,
系统中仍有一个“\n”。因此,当您循环并再次调用
scan.nextLine()
时,它不会提示您输入任何内容,因为它只会在
系统中读取“\n”,然后将您送入无限循环。

scan.nextLine()
Integer.parseInt(scan.nextLine())

希望这行得通

布伦特·纳什是正确的。要修复此错误,请尝试使用而不是
scan.nextLine()
Integer.parseInt(scan.nextLine())

希望这能起作用

您确定要在输入错误时从
calStrt
内调用
calStrt
?似乎是递归的一个坏点。如果有人发出错误的命令,那么内部循环的意义是什么?它将导致无限循环?您确定要从
calStrt
内部对错误输入调用
calStrt
?似乎是递归的一个坏点。如果有人发出错误的命令,内部循环的意义是什么?它将导致无限循环?当您在
System.in
上完成一个特定的操作,并且您想清除它以便为下一个操作刷新时,您可以这样做:
System.in.skip(Long.MAX\u值)
放弃
系统的其余部分。在
中,或者您可以尝试在
add()
末尾插入另一个对
scan.nextLine()的调用。虽然不理想,但它确实有效。标准输入有很多这样令人讨厌的边缘情况。感谢您的快速和有用的响应!当您在
System.in
上完成了一个特定的操作,并且希望将其清除以供下次操作使用时,您可以这样做:
System.in.skip(Long.MAX_值)
放弃
系统的其余部分。在
中,或者您可以尝试在
add()
末尾插入另一个对
scan.nextLine()的调用。虽然不理想,但它确实有效。标准输入有很多这样令人讨厌的边缘情况。感谢您的快速和有用的响应!