1

我正在尝试解析字符串表达式(即“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;
    }
}
4

2 回答 2

8

您的问题与/无关。问题只是您试图将空字符串解析为数字。找出为什么你有一个空字符串,然后修复它。(提示:你期望返回什么?)switchcaseexp.substring(0, 0)

您还应该考虑您期望exp.substring(i+1,i+2)何时返回iexp.length() - 1或什至exp.length() - 2)。

另外,退后一步,考虑一下为什么你认为这是switch/case部分的问题。查看堆栈跟踪 - 它甚至不在switch/case语句中,而是在它之前。能够诊断错误实际发生在哪里非常重要,这样您就可以专注于这一点,而不会被不相关的部分分散注意力。

于 2013-05-23T18:44:49.273 回答
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),这会在您的问题中引发异常。

哦,如果你正在评估一个表达式,为什么你的函数被称为“随机”?

于 2013-05-23T19:03:39.370 回答