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

时间:2016-12-08 20:21:00

标签: 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.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)

编辑(askForNumber()的代码):

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();
    }

1 个答案:

答案 0 :(得分:0)

传递给cByte的{​​{1}}中的字符不是数字。很可能你得到一些换行或类似的。你应该做的是在追加到Integer之前检查char是否为数字,如果没有则丢弃。要检查使用entireNumber 此外,您还需要在将java.lang.Character.isDigit()传递给整数之前检查它是否为空。当你阅读操作时,你只阅读单个字符,但你很可能在加{so} entireNumber的第一次传递之后按下一些东西,它仍然是空的。

最重要的是,在askForNumber()循环中,当你遇到行尾时,你正在脱离循环。如果在任何地方都一直这样做,那就没关系,但这不是你在做什么:
在第一个数字...你输入数字并点击输入=&gt;休息,
第二个数字...你输入数字并点击输入=&gt;休息,
操作...你输入它并点击enter =&gt;没有休息,你只需阅读askForNumber()中的第一个字符,EOL就在那里。所以在下一轮中会发生的是你输入while循环,遇到尾随EOL并在输入第一个数字之前退出循环。你需要修改它以退出循环,只要有一些数字已被输入并跳过并继续,否则......或者修复操作读取功能在循环中运行就像第一个那样,并且只有在选择了正确的操作后退出。

同样在上面的代码中,您可以直接比较in之类的字符串...它不会那样工作。 entireNumber != ""是一个对象,你应该调用它的String函数来与其他equals()进行比较。