我正在尝试解析字符串表达式(即“6 + 10 * 2-5”)并使用for-case语句将答案计算为double。但是我收到了错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.parseInt(Integer.java:499)
at Calculator.random(Calculator.java:50)
at Calculator.main(Calculator.java:210)
任何想法?
public static double random(String exp) {
double primeResult = 0;
for (int i=0; i<exp.length();i++) {
double left = Integer.parseInt(exp.substring(0,i));
double right = Integer.parseInt(exp.substring(i+1,i+2));
switch(exp.charAt(i)) {
case '*':
primeResult = left * right;
break;
case '/':
primeResult = left / right;
break;
case '+':
primeResult = left + right;
break;
case '-':
primeResult = left - right;
break;
default:
return 0;
}
System.out.println(primeResult);
}
return primeResult;
}
}
答案 0 :(得分:8)
您的问题无与switch
/ case
有关。问题只是你试图将空字符串解析为数字。弄清楚为什么你有一个空字符串,然后修复它。 (提示:您期望exp.substring(0, 0)
返回什么?)
当exp.substring(i+1,i+2)
为i
(或exp.length() - 1
)时,您还应该考虑您希望exp.length() - 2
返回的内容。
另外,退一步考虑为什么您认为这是switch
/ case
部分的问题。查看堆栈跟踪 - 它甚至不在switch
/ case
语句中,而是在它之前。能够诊断错误实际发生的位置非常重要,因此您可以专注于此而不会被不相关的部分分散注意力。
答案 1 :(得分:1)
Jon Skeet通过非常好的诊断培训回答了您的问题。
但是......我认为你的问题解决方案不起作用。
如果你在心理上追踪你的代码,假设正确输入“5 + 5”,你的循环首先要做的是:
double left = Integer.parseInt(exp.substring(0,i));
double right = Integer.parseInt(exp.substring(i+1,i+2));
i == 0(第一次循环),这将转换为:
double left = Integer.parseInt(exp.substring(0,0));
double right = Integer.parseInt(exp.substring(0+1,0+2));
这将立即获得exp.substring(0,0)
的“空字符串”,这会在您的问题中引发异常。
哦,如果你正在评估表达式,为什么你的函数被称为“随机”?