[英]Java Android Calculator crashes when operator is pressed before values are entered
If I press "=", "+", "-", "*", or "/" before any numbers, my app crashes! 如果我在任何数字前按“=”,“+”,“ - ”,“*”或“/”,我的应用程序崩溃了! I can't find any good answers to this and I'm not sure what I need to do.
我找不到任何好的答案,我不确定我需要做什么。
I've tried multiple different ways to make this calculator but I still get the same problem. 我已经尝试了多种不同的方法来制作这个计算器,但我仍然遇到同样的问题。 I'm thinking that somehow an If statement that has to do with OnCalculation.
我想某种方式是一个与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 = "";
}
}
Log: 日志:
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)
java.lang.NumberFormatException: Invalid double: "" at
Try initializing your total
string as "0"
instead of the empty String. 尝试将
total
字符串初始化为"0"
而不是空字符串。 Otherwise you get an error trying to convert nothing to a number! 否则,您尝试将任何内容转换为数字时会出错!
for example Double.parseDouble("");
例如
Double.parseDouble("");
produces error: 产生错误:
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)
Alternatively you could make a method to parse the string, and return zero for empty strings: 或者,您可以创建一个解析字符串的方法,并为空字符串返回零:
public static int parseDouble(final String value) {
if (value.equals("")) {
return 0;
}
return Double.parseDouble(value);
}
Then you can call it like this: 然后你可以像这样调用它:
EditText edit = (EditText) findViewById(R.id.editText);
String str2 = edit.getText().toString();
temp2 = parseDouble(str2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.