【问题标题】:Java Android Calculator crashes when operator is pressed before values are entered在输入值之前按下运算符时,Java Android Calculator 崩溃
【发布时间】:2016-11-16 18:52:38
【问题描述】:

如果我在任何数字之前按“=”、“+”、“-”、“*”或“/”,我的应用程序就会崩溃!我找不到任何好的答案,我不确定我需要做什么。

我尝试了多种不同的方法来制作这个计算器,但我仍然遇到同样的问题。我在想一个与 OnCalculation 相关的 If 语句。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

    public void onClick(View v) {
        Button button = (Button) v;
        String str = button.getText().toString();
        total += str;
        EditText edit = (EditText) findViewById(R.id.editText);
        edit.setText(total);
    }

    public void OnAdd(View v) {
        temp1 = Double.parseDouble(total);
        total = "";
        Button button = (Button) v;
        String str = button.getText().toString();
        sign += str;
        EditText edit = (EditText) findViewById(R.id.editText);
        edit.setText("");
    }

    public void OnCalculate(View v) {
        EditText edit = (EditText) findViewById(R.id.editText);
        String str2 = edit.getText().toString();
        temp2 = Double.parseDouble(str2);
        Double grand_total = 0.0;

        if (sign.equals("+")) {
            grand_total = temp1 + temp2;
        } else if (sign.equals("-")) {
            grand_total = temp1 - temp2;
        } else if (sign.equals("*")) {
            grand_total = temp1 * temp2;
        } else if (sign.equals("/")) {
            grand_total = temp1 / temp2;
        }
        edit.setText(grand_total + "");
        sign = "";
    }

public void OnClear(View v) {
    EditText edit = (EditText)findViewById(R.id.editText);
    edit.setText("");
    total = "";
}
}


日志:

07-13 18:45:32.831 25631-25631/com.example.shelbywallace.mycalc E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.example.shelbywallace.mycalc, PID: 25631
                                                                                  java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                                      at android.view.View.performClick(View.java:5702)
                                                                                      at android.widget.TextView.performClick(TextView.java:10888)
                                                                                      at android.view.View$PerformClick.run(View.java:22533)
                                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                                   Caused by: java.lang.reflect.InvocationTargetException
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                      at android.view.View.performClick(View.java:5702) 
                                                                                      at android.widget.TextView.performClick(TextView.java:10888) 
                                                                                      at android.view.View$PerformClick.run(View.java:22533) 
                                                                                      at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                      at android.os.Looper.loop(Looper.java:158) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                                                                                   Caused by: java.lang.NumberFormatException: Invalid double: ""
                                                                                      at java.lang.StringToReal.invalidReal(StringToReal.java:63)
                                                                                      at java.lang.StringToReal.parseDouble(StringToReal.java:267)
                                                                                      at java.lang.Double.parseDouble(Double.java:301)
                                                                                      at com.example.shelbywallace.mycalc.MainActivity.OnCalculate(MainActivity.java:54)
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                                      at android.view.View.performClick(View.java:5702) 
                                                                                      at android.widget.TextView.performClick(TextView.java:10888) 
                                                                                      at android.view.View$PerformClick.run(View.java:22533) 
                                                                                      at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                      at android.os.Looper.loop(Looper.java:158) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 你的 LogCat 怎么说?
  • 我已经更新了这个问题
  • 在计算方法中,您将 null 值解析为 double
  • 禁用操作按钮,直到操作数窗口中有数据。
  • 你可以检查字符串是否为空然后只执行计算。

标签: java android android-studio calculator


【解决方案1】:

java.lang.NumberFormatException: Invalid double: "" at

尝试将您的 total 字符串初始化为 "0" 而不是空字符串。否则,您在尝试将任何内容都转换为数字时会出错!


例如Double.parseDouble(""); 产生错误:

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at Ideone.main(Main.java:12)

或者,您可以创建一个方法来解析字符串,并为空字符串返回零:

public static int parseDouble(final String value) {
    if (value.equals("")) {
        return 0;
    }
    return Double.parseDouble(value);
}

那么你可以这样称呼它:

EditText edit = (EditText) findViewById(R.id.editText);
String str2 = edit.getText().toString();
temp2 = parseDouble(str2);

【讨论】:

  • 它确实可以防止应用程序在按下 add、sub、mult 和 div 按钮时崩溃;但它也会为之后添加的数字添加一个零。此外,它对 Equals 按钮没有任何作用,仍然会使应用程序崩溃。
  • 肯定为 Equals 工作,但我仍然对操作员有同样的问题......
猜你喜欢
  • 1970-01-01
  • 2017-01-26
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多