代码继续使用Java从System.in.read()接收输入

代码继续使用Java从System.in.read()接收输入,java,Java,对于赋值,我必须使用System.in.read()从用户处获取输入。我必须做一个计算器,可以使用多次,直到用户决定结束它 while(!stop) { System.out.println("Enter the first digit."); first = askForNumber(); System.out.println("Enter the second digit."); second = askForNumber();

对于赋值,我必须使用System.in.read()从用户处获取输入。我必须做一个计算器,可以使用多次,直到用户决定结束它

while(!stop) {
        System.out.println("Enter the first digit.");
        first = askForNumber();
        System.out.println("Enter the second digit.");
        second = askForNumber();
        System.out.println("Enter the operation to perform");
        operation = askForCharacter();
        if(first == 0 && first == second) {
            System.out.println("Calculator closing.");
            stop = true;
        }
        if(operation == '+') {
            System.out.println(first + second);
        }
        else if(operation == '-') {
            System.out.println(first - second);
        }
        else if(operation == '*') {
            System.out.println(first * second);
        }
        else if(operation == '/') {
            if(second == 0) {
                System.out.println("Cannot divide by zero.");
                System.out.println("Calculator closing.");
                stop = true;
            }
            System.out.println(first / second);
        }
        else {
            System.out.println("Not an operation");
        }
    }
但当我运行该程序时,我得到以下错误:

45
Enter the second digit.
pls enter number
45
Enter the operation to perform
+
90.0
Enter the first digit.
pls enter number
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Source)
at lopezProject.LopezProject.askForNumber(LopezProject.java:17)
at lopezProject.Calculator.main(Calculator.java:13)

传递给
Integer
cByte
中的字符不是数字。最有可能的是你得到了一些线饲料或类似的。您应该做的是在添加到
entireNumber
之前检查字符是否为数字,如果不是,则放弃。要检查,请使用
java.lang.Character.isDigit()

此外,在将
entireNumber
传递给integer之前,还需要检查它是否为空。当您读取操作时,您只读取单个字符,但在第一次传入
askForNumber()
到整数时,很可能会在加号之后按某个字符,它仍然是空的

最重要的是,在
askForNumber()
循环中,当遇到行尾时,您将脱离循环。如果在任何地方都坚持这样做,那就没问题了,但这不是你正在做的:
在第一个数字上。。。键入数字并按enter=>break,
第二位数。。。键入数字并按enter=>break,
活动您键入它并点击enter=>没有中断,您只需从中的
读取第一个字符,EOL就在后面。所以在下一轮中,您将进入while循环,遇到尾随的EOL并在键入第一个数字之前退出循环。你需要修改它以退出循环,如果已经键入了某个数字,则跳过并继续,否则。。。或者修复操作读取功能,使其像数字1一样在循环中运行,并仅在选择正确的op后退出


在上面的代码中,您还可以直接比较字符串,如
entireNumber!=“”
。。。好吧,这样不行
String
是一个对象,您应该调用它的
equals()
函数与另一个
String

进行比较。您还应该为askForNumber()添加代码。为什么控制台中有一个点写着“请输入数字”?这是一个输入吗?@aleb2000来自askForNumber(),正如Reek指出的那样,bug也存在于该方法中。对不起,我忘了添加askForNumber()的代码;好的,我编辑了这篇文章以包含代码。感谢您的快速回复。我使用以下方法对其进行了更改:if(java.lang.Character.isDigit(cByte)){entireNumber+=cByte;//并将其添加到str string}中,检查char是否为数字,但仍然会给我相同的错误。在转换为数字之前,还要检查一件事。修改了我的答案,将其包括在内。我更改了代码和OP,但现在它产生了以下错误:输入第一个数字。请输入数字4输入第二位数字。请输入数字5输入要执行的操作+9.0输入第一位数字。请输入第二位数字。请输入数字3输入要执行的操作--3.0输入第一位数字。请输入第二位数字。请在正确运行一次后输入数字是的,这个代码有很多问题。请参阅最新修订答案的解决方案。在编写代码时,您应该更仔细地考虑所做工作的副作用;)。。。但我想那只是经验
public static double askForNumber() throws java.io.IOException {
    char cByte;
    String entireNumber = "";
    Integer n = 0;
    System.out.println("pls enter number");
    while(true) { //while the user is still entering information
    cByte = (char)System.in.read(); //each byte is being turned into a character
    if ((cByte == ' ') || (cByte == '\n')) {
    break;
    }
    if(java.lang.Character.isDigit(cByte)) {
        entireNumber += cByte; //and added to the str string            
    }
    }
    if(entireNumber != "") {
    n = new Integer(entireNumber.trim()); //turning the string into an integer
    }
    return (double)n.intValue();
    }

public static char askForCharacter() throws java.io.IOException {
    return (char)System.in.read();
    }