对于作业,我必须使用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();
}
答案 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()
进行比较。