java - 如果 switch/cases 场景中的语句使我的应用程序崩溃
问题描述
使用 Android Studio 和 Java,我正在尝试构建一个应用程序,该应用程序根据先前其他按钮单击的输入输出不同的信息。我遇到的问题是if
Switch/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)
解决方案
它崩溃的原因是字符串变量 bUttn 仅在 R.id.button3 的情况下被初始化。这很重要,因为如果没有初始化,bUttn 将为空。
因此,如果 case R.id.button5 为真,则 bUttn 将永远不会被初始化,因为初始化发生在不同的情况下,并且在空字符串上调用 .equals() 将导致 NullPointerException。
推荐阅读
- javascript - 使用构造函数的 JUnit 测试失败
- ios - 如何使用“AVPlayerItemVideoOutput”同时渲染多个视频?
- python - 如何计算熊猫数据框的n列中存在值的人数
- c++ - 使用指针调用时使 decltype 输出非引用类型
- c# - 打印调酒师文件
- postgresql - Postgres:在另一个数据库中创建对象而不连接到它
- arrays - C编程问题中的数组和指针
- javascript - 对象作为 React 子级无效,渲染一组子级,使用数组代替
- python - 如何在 Pygame 中更改游戏中的分数?
- vue.js - 如何仅部署 Vue 应用程序的一部分而不是完整的 Vue 应用程序?