(android)如何发现和解决(NullPointerException)空指针异常问题(持续优化)
Posted 花猫要豹豹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(android)如何发现和解决(NullPointerException)空指针异常问题(持续优化)相关的知识,希望对你有一定的参考价值。
大家好,我是豹豹哥,友爱互融,共同进步💕🤞
项目场景:
项目场景:在构建一个APP的过程中没有出现想要的效果(想要点解menu进入SettingActivity.xml的,但是程序老是崩溃,继而成重新运行程序) Logcat出现如下问题:(空指针异常) Process: com.example.admin, PID: 6671
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object
问题描述:
在点击程序右上角的菜单时,程序自动回到SplashActivity.xml界面(后来才知道是程序崩溃的表现)
原因分析:
根据代码可知,如果程序正常运行,是会跳转到SettingActivity的,但是程序却运行到了SplashActivity,
case R.id.action_setting:
Log.d(TAG, "onOptionsItemSelected: action_setting");
Intent intent = new Intent(MainActivity.this, SettingActivity.class);
然后我在学长的帮助下查阅了整个MainActivity.java发现根本就没有提到SplashActivity(然后得出结论,程序运行到SplashActivity欢迎界面是程序崩溃了,不是其他原因)(崩溃原因自然是上面提到的空指针异常)
package com.example.admin;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {//to ensure that the MainActivity.java use
//Activity not ActionBarActivity
TextView tempView;
void init() {
//tempView= findViewById(R.id.text_temp_value);
tempView = findViewById(R.id.text_temp_value);
}
private static final String TAG = "wang";
@Override
public boolean onCreateOptionsMenu(Menu menu) {//click oCOM to recreate the method
getMenuInflater().inflate(R.menu.setting, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// case R.id.add_item:
// Toast.makeText(this, "you clicked Add", Toast.LENGTH_LONG).show();
// break;
// case R.id.remove_item:
// Toast.makeText(this,"you clicked Remove",Toast.LENGTH_LONG).show();
// break;
case R.id.action_setting:
Log.d(TAG, "onOptionsItemSelected: action_setting");
Intent intent = new Intent(MainActivity.this, SettingActivity.class);
//to get the value of temperature
Log.d(TAG, "onOptionsItemSelected: tempview is " + (tempView == null));
if (tempView == null) {
Log.d(TAG, "onOptionsItemSelected: is null");
} else {
Log.d(TAG, "onOptionsItemSelected: is not null");
}
// String tempValue = tempView.getText().toString().trim();
String tempValue = getStr(tempView);
Log.d(TAG, "onOptionsItemSelected: 11111");
Log.d(TAG, "onOptionsItemSelected: the tempValue is " + tempValue);
intent.putExtra("tempValue", tempValue);
Log.d(TAG, "onOptionsItemSelected: put in.");
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public String getStr(TextView tx) {
return tx.getText().toString().trim();
}
}
解决方案:
(在学长帮助下解决了问题,为了叙述方便,下面用第一人称)
这里隆重介绍查错必备,log家族,有关log查错的文章可以看其他博主的)代码看上面的一大长串的就好。
步骤一:
首先:(用Logd写一句打印语句,判断有没有获得action_setting的ID)(结果是成立)
case R.id.action_setting:
Log.d(TAG, "onOptionsItemSelected: action_setting");
Intent intent = new Intent(MainActivity.this, SettingActivity.class);
然后再这个地方用了打印语句,发现打印不出来(那问题就出现在这两句直之间了)
intent.putExtra("tempValue",tempValue);
Log.d(TAG, "onOptionsItemSelected: put in.");
startActivity(intent);
return true;
步骤二:
继续缩小范围
String tempValue = tempView.getText().toString().trim();
// String tempValue = getStr(tempView);
Log.d(TAG, "onOptionsItemSelected: 11111");
Log.d(TAG, "onOptionsItemSelected: the tempValue is "+tempValue);
intent.putExtra("tempValue",tempValue);
发现还是打印不出来,然后问题就明确了,这段代码的上面只有一条语句
String tempValue = tempView.getText().toString().trim();
这就是问题所在了
步骤三:
到这里只是知道问题在哪里,但是具体原因还不清楚,然后我们用更细化的打印语句结合if来找出具体是哪个空指针
Log.d(TAG, "onOptionsItemSelected: tempview is "+(tempView==null));
if (tempView==null){
Log.d(TAG, "onOptionsItemSelected: is null");
}else {
Log.d(TAG, "onOptionsItemSelected: is not null");
}
(上面这段代码用来看是不是出现了空指针异常)
Log.d(TAG, "onOptionsItemSelected: 11111");
Log.d(TAG, "onOptionsItemSelected: the tempValue is "+tempValue);
(上面这段代码用来判断是tempView为空指针还是tempValue为空指针)
根据logcat打印语句,发现是tempView为空指针
(下面这段代码中是把text_temp_value绑定给tempView的,但是结合再下面一段代码我们发现一个致命问题)
void init(){
//tempView= findViewById(R.id.text_temp_value);
tempView= findViewById(R.id.text_temp_value);
}
(注意setContentView(R.id.activity_main)方法,所以我们的text_temp_value理应出现再activity_main里啊,但是在activity_main里查不到(请看再下面一张图片))
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
步骤四:
OK,所有的问题都发现了,下面我们改了一下传递的id,成功运行!
void init(){
//tempView= findViewById(R.id.text_temp_value);
tempView= findViewById(R.id.real_time_temperature);
}
<TextView
android:id="@+id/real_time_temperature"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@color/white_blue_green"
android:text="@string/real_time_temperature"
android:textColor="@color/red" />
结语:通过这段博客的书写,我发现我对于空指针异常这个地方理解的还不够深入,希望大家多多评论和私信,如有不足,还望指正😘🤞
以上是关于(android)如何发现和解决(NullPointerException)空指针异常问题(持续优化)的主要内容,如果未能解决你的问题,请参考以下文章
使用myeclipse tomcat插件部署web项目时报错 an internal error occurred during add deployment . java.lang.nullpoin
(android)如何发现和解决(NullPointerException)空指针异常问题(持续优化)
android布局中出现难以理解的错误,如何发现问题并解决?
Android Studio 如何解决在左边的“Text”布局页面上编辑时,发现右侧视图不见了