switch/cases场景中的java if语句使我的应用程序崩溃
使用AndroidStudio和Java,我正试图构建一个应用程序,根据之前其他按钮的点击输入输出不同的信息。我遇到的问题是Switch/Case中的if
语句,每当不满足条件时,它就会使应用程序崩溃。在这种情况下,当变量bUttn
不等于“3”时,按钮5会使整个应用程序崩溃。当条件满足时,它工作得很好,并且它做了它应该做的事情。我做错了什么
以下是我的代码示例:
Package com.example.testjava4;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓.annotation.SuppressLint;
import 安卓.app.Activity;
import 安卓.os.Bundle;
import 安卓.util.Log;
import 安卓.view.View;
import 安卓.view.View.OnClickListener;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.Button;
import 安卓.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, 安卓.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 安卓.intent.action.MAIN -c 安卓.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 安卓.view.View.performClick(View.java:4780)
at 安卓.view.View$PerformClick.run(View.java:19866)
at 安卓.os.Handler.handleCallback(Handler.java:739)
at 安卓.os.Handler.dispatchMessage(Handler.java:95)
at 安卓.os.Looper.loop(Looper.java:135)
at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:698)
# 1 楼答案
它崩溃的原因是字符串变量bUttn仅在R.id.button3的情况下初始化。这很重要,因为如果没有初始化,bUttn将为null
所以,如果case R.id.button5为true,那么bUttn将永远不会被初始化,因为初始化发生在不同的情况下,并且调用。null字符串上的等于()将导致NullPointerException
# 2 楼答案
您刚刚声明了}
bUttn
变量。您没有初始化bUttn
。这就是为什么它显示NullPointer Exception
。因为在if的情况下,你正在比较bUttn
值和3
。但当时Button已经{你应该把
String bUttn;
改为String bUttn=""
或String bUttn="0"
如果
bUttn
将是Int
值,可以将bUttn
的数据类型更改为Int