[英]Java Calculator android app force closes when any operators prior to or after calculations (need exception handling help)
我试图找出使用 onClick 侦听器处理异常的最佳方法。 代码中的所有内容都可以正常工作,但如果我在输入数字之前或计算之后按+, -, *, /, =
,它会使应用程序崩溃。 任何帮助,将不胜感激。 这段代码是我正在开发的多功能工具应用程序的一部分。 代码如下:
**编辑删除与错误无关的代码并添加调试输出
公共类计算器扩展片段{
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = ADDITION;
display.setText(String.valueOf(val1) + " + ");
displayInfo.setText(null);
}
});
sub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SUBTRACTION;
display.setText(String.valueOf(val1) + " - ");
displayInfo.setText(null);
}
});
multiply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = MULTIPLICATION;
display.setText(String.valueOf(val1) + " * ");
displayInfo.setText(null);
}
});
divide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = DIVISION;
display.setText(String.valueOf(val1) + " / ");
displayInfo.setText(null);
}
});
equal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = EQUALS;
display.setText(String.valueOf(val1));
val1 = Double.NaN;
val2 = Double.NaN;
displayInfo.setText(null);
}
}
});
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.calculator, container, false);
}
private void setupUIView(){
zero = (Button)getView().findViewById(R.id.button_0);
one = (Button)getView().findViewById(R.id.button_1);
two = (Button)getView().findViewById(R.id.button_2);
three = (Button)getView().findViewById(R.id.button_3);
four = (Button)getView().findViewById(R.id.button_4);
five = (Button)getView().findViewById(R.id.button_5);
six = (Button)getView().findViewById(R.id.button_6);
seven = (Button)getView().findViewById(R.id.button_7);
eight = (Button)getView().findViewById(R.id.button_8);
nine = (Button)getView().findViewById(R.id.button_9);
decimal = (Button)getView().findViewById(R.id.button_dec);
negate = (Button)getView().findViewById(R.id.button_neg);
equal = (Button)getView().findViewById(R.id.button_eql);
multiply = (Button)getView().findViewById(R.id.button_mult);
add = (Button)getView().findViewById(R.id.button_add);
sub = (Button)getView().findViewById(R.id.button_sub);
divide = (Button)getView().findViewById(R.id.button_div);
percent = (Button)getView().findViewById(R.id.button_prcnt);
power = (Button)getView().findViewById(R.id.button_pwr);
clear = (Button)getView().findViewById(R.id.button_clr);
display = (TextView)getView().findViewById(R.id.display);
displayInfo = (TextView)getView().findViewById(R.id.displayinfo);
}
private void compute(){
if(!Double.isNaN(val1)){
val2 = Double.parseDouble(displayInfo.getText().toString());
switch (ACTION){
case ADDITION:
val1 = val1 + val2;
break;
case SUBTRACTION:
val1 = val1 - val2;
break;
case MULTIPLICATION:
val1 = val1 * val2;
break;
case DIVISION:
val1 = val1 / val2;
break;
case EQUALS:
break;
}
}
else{
val1 = Double.parseDouble(displayInfo.getText().toString());
}
}
}
日志猫:
Process: myapplication, PID: 29796
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 myapplication.Calculator.compute(Calculator.java:260)
at myapplication.Calculator.access$400(Calculator.java:19)
at myapplication.Calculator$16.onClick(Calculator.java:187)
at android.view.View.performClick(View.java:7870)
at android.widget.TextView.performClick(TextView.java:14952)
at android.view.View.performClickInternal(View.java:7839)
at android.view.View.access$3600(View.java:886)
at android.view.View$PerformClick.run(View.java:29315)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)
val1 = Double.parseDouble(displayInfo.getText().toString());
这条线应该是你的第一个问题。 您正在尝试设置 val1,但 displayInfo.getText() 正在返回 "" 或 NULL。
解决问题的一种方法是使用 if 语句将所有内容包装在 onclick()-Method 中,检查 displayInfo 是否为空。 例如:
public void onClick(View v) {
if(!(displayInfo.getText().toString().equals(""))){
compute();
ACTION = DIVISION;
display.setText(String.valueOf(val1) + " / ");
displayInfo.setText("");
}
}
请注意,我用空字符串替换了 displayInfo 的文本重置,因为您试图将 null 与某个字符串连接起来,这会让您的应用程序在计算一次后崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.