2013-03-09 79 views
0

我正在尝试制作计算器应用程序,但不幸的是,我解析字符串时发生卡住。计算器字符串解析错误 - NumberFormatException

该应用程序接受输入并将其显示在EditText et2中。当按下“平等”键时,计算器执行以下工作。

et2 = (EditText) findViewById(R.id.editText2); 
s = et2.getText().toString(); 
int k = 0, i = 0, j = 0, operatorTop = -1, operandTop = -1, end = 0; 
float left, right; 
float operandStack[] = new float[50]; 
char operatorStack[] = new char[50]; 

for (i = 0; i < s.length(); i++) { 

    if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*' 
      || s.charAt(i) == '/') { 

     if (i == 0 || i == s.length() - 1) { 
      break; 
     } else { 

      left = Float.valueOf(s.substring(k, i - 1)); 
      operandStack[++operandTop] = left; 

      operatorStack[++operatorTop] = s.charAt(i); 
      if (operatorStack[operatorTop] == '*' 
        || operatorStack[operatorTop] == '/') { 
       for (j = i + 1; j < s.length(); j++) { 
        if (s.charAt(j) == '+' || s.charAt(j) == '-' 
          || s.charAt(j) == '*' || s.charAt(j) == '/') 
         end = j - 1; 
        if (j == s.length() - 1) 
         end = j; 

       } 
       right = Float.valueOf(s.substring(i + 1, end)); 
       if (operatorStack[operatorTop] == '*') 
        operandStack[operandTop] = operandStack[operandTop] 
          * right; 
       if (operatorStack[operatorTop] == '/') 
        operandStack[operandTop] = operandStack[operandTop] 
          /right; 
       operatorTop--; 

      } 
      k = i++; 

     } 
    } 
} 
operandStack[++operandTop] = Float.valueOf(s.substring(k, 
     s.length() - 1)); 
for (i = operatorTop; i > -1; i--) { 
    char ch = operatorStack[operatorTop]; 
    switch (ch) { 
    case '+': 
     operandStack[operandTop - 1] += operandStack[operandTop]; 
     operandTop--; 
     operatorTop--; 
     break; 
    case '-': 
     operandStack[operandTop - 1] += operandStack[operandTop]; 
     operandTop--; 
     operatorTop--; 
     break; 

    } 
    et1.setText("" + operandStack[operandTop]); 
} 

我得到一个NumberFormatException错误。这里是错误日志:

03-09 16:54:07.493: E/AndroidRuntime(362): FATAL EXCEPTION: main 
03-09 16:54:07.493: E/AndroidRuntime(362): java.lang.IllegalStateException: Could not  execute method of the activity 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.view.View$1.onClick(View.java:2072) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.view.View.performClick(View.java:2408) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.view.View$PerformClick.run(View.java:8816) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.os.Handler.handleCallback(Handler.java:587) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.os.Looper.loop(Looper.java:123) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.reflect.Method.invoke(Method.java:521) 
03-09 16:54:07.493: E/AndroidRuntime(362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-09 16:54:07.493: E/AndroidRuntime(362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-09 16:54:07.493: E/AndroidRuntime(362): at dalvik.system.NativeStart.main(Native Method) 
03-09 16:54:07.493: E/AndroidRuntime(362): Caused by: java.lang.reflect.InvocationTargetException 
03-09 16:54:07.493: E/AndroidRuntime(362): at yadav.sanjay.calculator.CalculatorActivity.click(CalculatorActivity.java:309) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.reflect.Method.invoke(Method.java:521) 
03-09 16:54:07.493: E/AndroidRuntime(362): at android.view.View$1.onClick(View.java:2067) 
03-09 16:54:07.493: E/AndroidRuntime(362): ... 11 more 
03-09 16:54:07.493: E/AndroidRuntime(362): Caused by: java.lang.NumberFormatException: 
03-09 16:54:07.493: E/AndroidRuntime(362): at org.apache.harmony.luni.util.FloatingPointParser.parseFloat(FloatingPointParser.java:305) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.Float.parseFloat(Float.java:291) 
03-09 16:54:07.493: E/AndroidRuntime(362): at java.lang.Float.valueOf(Float.java:330) 
03-09 16:54:07.493: E/AndroidRuntime(362): ... 15 more 
+0

这个例外是自解释的。你已经要求Float.parse()解析一个不能表示为浮点的字符串。可能是一个空字符串或类似“1 + 2”的东西。该字符串只能包含表示可以是浮动的数字的字符。在309行上放置一个断点并检查这些值。 – Simon 2013-03-09 11:49:17

+0

我知道错误类型。我无法得到的是我传递的字符串不是一个数字。手动计算后,传递的字符串是一个数字。任何运营商都没有通过手动计算。 – Exorcist 2013-03-09 11:54:17

+0

首先使用ParseInt解析左边,然后使用float – 2013-03-09 12:04:06

回答

1

您是尝试解析一个没有整型值到整数

Caused by: java.lang.NumberFormatException: 

按照在logcat中提供线的数量来纠正你的错误

你的错误必须在这里发生

left=Float.valueOf(s.substring(k,i-1)); 

其它这里

right=Float.valueOf(s.substring(i+1,end)); 

尝试这样做

String leftString=s.substring(k,i-1); 

,并检查leftString可以转化为float/Integer

1
Caused by: java.lang.NumberFormatException 

所以问题是,你的String格式无效,且无法解析为数字。所以我的建议是使用例如正则表达式之前,你将执行解析:

if (yourString.matches("-?[0-9]+")) { // or "[+-]?\\d*(\\.\\d+)?" 
    // do your work. 
} 

注:同时添加try-catch块捕捉Exception,使一些日志有关的问题(例如打印字符串值) 。