Android 计算器不执行任何计算并在按下等号按钮时崩溃

Android calculator does not perform any calculation and crashes when equal button is pressed

所有数字按钮都工作正常,但计算器不执行任何计算,而且每当按下等号键时应用程序崩溃。如果我只按 +、-、*、/ 键而不输入任何数字,应用程序也会崩溃。这是我主要的代码 java class.

public class MainActivity extends AppCompatActivity {

    float ValueOne, ValueTwo;
    Boolean add, sub, div, multi ;

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

        Button one = (Button) findViewById(R.id.one);
        Button two = (Button) findViewById(R.id.two);
        Button three = (Button) findViewById(R.id.three);
        Button four = (Button) findViewById(R.id.four);
        Button five = (Button) findViewById(R.id.five);
        Button six = (Button) findViewById(R.id.six);
        Button seven = (Button) findViewById(R.id.seven);
        Button eight = (Button) findViewById(R.id.eight);
        Button nine = (Button) findViewById(R.id.nine);
        Button zero = (Button) findViewById(R.id.zero);
        Button decimal = (Button) findViewById(R.id.decimal);
        Button plus = (Button) findViewById(R.id.plus);
        Button minus = (Button) findViewById(R.id.minus);
        Button multiply = (Button) findViewById(R.id.multiply);
        Button divide = (Button) findViewById(R.id.divide);
        Button del = (Button) findViewById(R.id.del);
        Button eq = (Button) findViewById(R.id.eq);
        final EditText calculation = (EditText) findViewById(R.id.calculation);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "1");
            }
        });

        two.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "2");
            }
        });

        three.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "3");
            }
        });

        four.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "4");
            }
        });

        five.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "5");
            }
        });

        six.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "6");
            }
        });

        seven.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "7");
            }
        });

        eight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "8");
            }
        });

        nine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "9");
            }
        });

        zero.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + "0");
            }
        });

        decimal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                calculation.setText(calculation.getText() + ".");
            }
        });

        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (calculation == null) {
                    calculation.setText("");
                }
                else {
                    ValueOne = Float.parseFloat(calculation.getText() + "");
                    add = true;
                    calculation.setText(null);
                }
            }
        });

        minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (calculation == null) {
                    calculation.setText("");
                } else {
                    ValueOne = Float.parseFloat(calculation.getText() + "");
                    sub = true;
                    calculation.setText(null);
                }
            }
        });

        multiply.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (calculation == null) {
                    calculation.setText("");
                } else {
                    ValueOne = Float.parseFloat(calculation.getText() + "");
                    multi = true;
                    calculation.setText(null);
                }
            }
        });

        divide.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (calculation == null) {
                    calculation.setText("");
                } else {
                    ValueOne = Float.parseFloat(calculation.getText() + "");
                    div = true;
                    calculation.setText(null);
                }
            }
        });

        eq.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ValueTwo = Float.parseFloat(calculation.getText() + "");
                if (add == true) {
                    calculation.setText(ValueOne + ValueTwo + "");
                    add=false;
                }

                if(sub == true){
                    calculation.setText(ValueOne - ValueTwo + "");
                    sub=false;
                }

                if (multi == true){
                    calculation.setText(ValueOne*ValueTwo + "");
                    multi = false;
                }

                if (div == true){
                    calculation.setText(ValueOne/ValueTwo + "");
                    div = false;
                }
            }


        });

        del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               calculation.setText("");
            }
        });



    }
}

这是当我尝试添加 2 个数字并按下等号时的日志猫,然后我的应用程序崩溃了。

08-12 16:04:52.402 4671-4671/jarvis.calc E/AndroidRuntime: FATAL EXCEPTION: main
                                                       Process: jarvis.calc, PID: 4671
                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
                                                           at jarvis.calc.MainActivity.onClick(MainActivity.java:187)
                                                           at android.view.View.performClick(View.java:5198)
                                                           at android.view.View$PerformClick.run(View.java:21147)
                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                           at android.os.Looper.loop(Looper.java:148)
                                                           at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

08-12 16:04:57.023 4671-4671/jarvis.calc I/Process:发送信号。 PID:4671 SIG:9

初始化您的 Boolean 值。

Boolean add = false, sub = false, div = false, multi = false;

更新 plusminusmultiplydivideonClick 方法,如

@Override
public void onClick(View view) {
    if (calculation.getText().toString().trim().length() > 0) {
        ValueOne = Float.parseFloat(calculation.getText() + "");
        add = true; // Change variable correspondingly for sub, multi & div
        calculation.setText(null);
    }
}

不要使用calculation.setText(null);

改用calculation.setText("");

在条件中使用之前初始化布尔值是非常必要的。否则它会弹出一个空对象引用。

所以你需要在函数中执行之前为每个布尔项初始化一个布尔值。

你的情况:

boolean add=false, sub=false , multi = false, div= false;

这样初始化,你的错误就解决了。