Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Calculator android应用程序force在计算之前或之后的任何操作符关闭(需要异常处理帮助)_Java_Android - Fatal编程技术网

Java Calculator android应用程序force在计算之前或之后的任何操作符关闭(需要异常处理帮助)

Java Calculator android应用程序force在计算之前或之后的任何操作符关闭(需要异常处理帮助),java,android,Java,Android,我正试图找出处理onClick侦听器异常的最佳方法。代码中的所有内容都可以正常工作,但如果我在输入数字之前或计算之后按+,-,*,/,=,则会导致应用程序崩溃。任何帮助都将不胜感激。这段代码是我正在开发的多功能工具应用程序的一部分。代码如下: **编辑以删除与错误和外接程序调试输出无关的代码 公共类计算器扩展片段{ add.setOnClickListener(new View.OnClickListener() { @Override public vo

我正试图找出处理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,但displayInfo.getText()返回“”或NULL

解决问题的一种方法是使用if语句将所有内容包装在onclick()方法中,检查displayInfo是否为空。 e、 g:


请注意,我将displayInfo的文本重置替换为空字符串,因为您试图将null与某个字符串连接起来,这会让您的应用程序在计算一次后崩溃。

我认为当计算器只有一个命令时,也会发生同样的问题,试着提供调试器输出。如果你给我们看logcat@ehelmick93会有帮助的。谢谢大家,这是我第一次在这里发布帮助。我已经用调试和更少的代码更新了我的原始帖子谢谢,这很有效!我以前曾尝试将其包装在if语句中,但它正在检查is.equals(Double.NaN),默认值为val1/val2。我感谢你的帮助!
  val1 = Double.parseDouble(displayInfo.getText().toString());
        public void onClick(View v) {
        if(!(displayInfo.getText().toString().equals(""))){
            compute();
            ACTION = DIVISION;
            display.setText(String.valueOf(val1) + " / ");
            displayInfo.setText("");
        }
    }