我正在尝试解析一个字符串表达式(即"6+10*2-5"),并使用for-case语句计算出双精度值。然而,我得到了一个错误:
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;
    }
}发布于 2013-05-24 02:44:49
您的问题与switch/case无关。问题很简单,您试图将一个空字符串解析为一个数字。弄清楚为什么会有一个空字符串,然后修复它。(提示:您希望exp.substring(0, 0)返回什么?)
您还应该考虑当i为exp.length() - 1 (甚至是exp.length() - 2)时,您期望exp.substring(i+1,i+2)返回什么。
另外,后退一步,考虑一下为什么您认为这是switch/case部件的问题。看看堆栈跟踪-它甚至不在switch/case语句中,而是在它之前。能够诊断错误实际发生的位置是非常重要的,这样你就可以专注于此,而不会被不相关的部分分散注意力。
发布于 2013-05-24 03:03:39
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)获得一个“空字符串”,从而抛出您的问题中的异常。
哦,如果你在计算一个表达式,为什么你的函数被称为“随机”呢?
https://stackoverflow.com/questions/16721552
复制相似问题