首页 > 解决方案 > 如果 switch/cases 场景中的语句使我的应用程序崩溃

问题描述

使用 Android Studio 和 Java,我正在尝试构建一个应用程序,该应用程序根据先前其他按钮单击的输入输出不同的信息。我遇到的问题是ifSwitch/Case 中的语句每次不满足条件时都会使应用程序崩溃。bUttn在这种情况下,当变量不等于“3”时,按钮 5 会使整个应用程序崩溃。当条件满足时,它工作得很好,它会做它应该做的事情。我究竟做错了什么?

这是我的代码示例:

Package com.example.testjava4;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import java.util.Arrays;


public class MainActivity extends Activity implements View.OnClickListener {

    ListView list;
    String[] kakNmbrs = {"1+2+5+8+9", "1+2+6+7+9", "1+3+4+8+9", "1+3+5+7+9", "1+3+6+7+8", "1+4+5+6+9", "1+4+5+7+8",
            "2+3+4+7+9", "2+3+5+6+9", "2+3+5+7+8", "2+4+5+6+8", "3+4+5+6+7"};
    String bUttn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn3 = (Button) findViewById(R.id.button3);
        Button btn4 = (Button) findViewById(R.id.button4);
        Button btn5 = (Button) findViewById(R.id.button5);
        btn3.setOnClickListener(this); // calling onClick() method
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
    }

    @SuppressLint("NonConstantResourceId")
    @Override

    public void onClick(View v) {
        Button bTTon4 = (Button) findViewById(R.id.button4);
        list = findViewById(R.id.myList);
        Arrays.sort(kakNmbrs);
        ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.mytextsize, android.R.id.text1, kakNmbrs);
        switch (v.getId()) {

            case R.id.button3:
                bUttn = "3";
                Log.i(bUttn, "I just clicked on");
                break;

            case  R.id.button4:
                break;

            case  R.id.button5:
               if (bUttn.equals("3")) {
                    list.setAdapter(adapter);
                   bTTon4.setVisibility(View.INVISIBLE);
                break;
                }


        }
    }
}

如果有任何帮助,这里是 logcat 日志:

11/11 14:37:59: Launching 'app' on Andi Emu API 22. Install successfully finished in 8 s 374 ms. $ adb shell am start -n "com.example.testjava4/com.example.testjava4.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Connected to process 6809 on device 'emulator-5554'. Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page. D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true D/: HostConnection::get() New Host Connection established 0xb40f1ce0, tid 6809 D/Atlas: Validating map... D/: HostConnection::get() New Host Connection established 0xb43fb330, tid 6825 I/OpenGLRenderer: Initialized EGL, version 1.4 W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... D/EGL_emulation: eglCreateContext: 0xb42a4b80: maj 2 min 0 rcv 2 D/EGL_emulation: eglMakeCurrent: 0xb42a4b80: ver 2 0 (tinfo 0xb4272ce0) D/OpenGLRenderer: Enabling debug mode 0 D/EGL_emulation: eglMakeCurrent: 0xb42a4b80: ver 2 0 (tinfo 0xb4272ce0) D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testjava4, PID: 6809
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at com.example.testjava4.MainActivity.onClick(MainActivity.java:55)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

标签: javaandroid

解决方案


它崩溃的原因是字符串变量 bUttn 仅在 R.id.button3 的情况下被初始化。这很重要,因为如果没有初始化,bUttn 将为空。

因此,如果 case R.id.button5 为真,则 bUttn 将永远不会被初始化,因为初始化发生在不同的情况下,并且在空字符串上调用 .equals() 将导致 NullPointerException。


推荐阅读