重启后app.linuxduck.com.tamapet崩溃:NullPointerException问题求助
Android应用重启后崩溃:NullPointerException 解决方案
我开发的app.linuxduck.com.tamapet应用此前运行正常,但重启后崩溃,控制台抛出如下错误:
Process: app.linuxduck.com.tamapet, PID: 22284 java.lang.RuntimeException: Unable to start activity ComponentInfo{app.linuxduck.com.tamapet/app.linuxduck.com.tamapet.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.widget.ImageView.getBackground()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.widget.ImageView.getBackground()' on a null object reference at app.linuxduck.com.tamapet.MainActivity.onCreate(MainActivity.java:286) at android.app.Activity.performCreate(Activity.java:8305) at android.app.Activity.performCreate(Activity.java:8284) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
相关代码片段
MainActivity部分代码
package app.linuxduck.com.tamapet; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Point; import android.graphics.drawable.AnimationDrawable; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Button; import android.widget.Toast; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.util.ArrayList; import static java.lang.Math.abs; import static java.lang.System.currentTimeMillis; public class MainActivity extends AppCompatActivity { // Initializations // --------------- // Pet private Pet myPet; // Ints private int timeKeeper; private int gameAttempts; private int random; private int SHORTduration; private int LONGduration; private int creatureChoice; private int resourceID; private int width; private int height; // Floats private float objX; private float objY; //TextViews private TextView hungerIntText; private TextView waterIntText; private TextView ageIntText; private TextView happyIntText; private TextView healthIntText; private TextView deathIntText; private TextView nameYourNewPetText; private TextView deadPetText; private TextView guessANumberText; private TextView alreadyGuessedLettersText; private TextView hiddenWordText; private TextView guessALetterText; private TextView loadedPetNameText; // Buttons private Button gameOneButton; private Button gameTwoButton; private Button listOfPetsButton; private Button createNewPetButton; private Button openOldPetButton; private Button submitButton; // ImageButtons private ImageButton featherImageButton; private ImageButton ballImageButton; private ImageButton soundImageButton; private ImageButton savedCreaturesImageButton; private ImageButton mealImageButton; private ImageButton treatImageButton; private ImageButton waterImageButton; private ImageButton playImageButton; private ImageButton punishImageButton; private ImageButton shotImageButton; // EditTexts private EditText numberEditText; private EditText letterEditText; private EditText nameEditText; // Characters Character characterGuess; // CharSequences private CharSequence name; // Strings private String hiddenWordString; private String randomlyChoseWord; private String eventText; private String word; // Booleans private boolean saveButtonWasOpened; private boolean featherWasClicked; private boolean ballWasClicked; private boolean soundORnot; private boolean loaded; private boolean first; private boolean second; // ImageViews private ImageView creatureImage; private ImageView currentCreatureImg; private ImageView featherImg; private ImageView ballImg; private ImageView waterImg; private ImageView foodImg; private ImageView treatImg; private ImageView heartImage; private ImageView butterImage; // Views private View view; // Contexts private Context context; // MediaPlayers private MediaPlayer catpurrSound; private MediaPlayer drinkingSound; private MediaPlayer eatingSound; // LinearLayouts private LinearLayout linearLayout; // ArrayLists private ArrayList<Character> guessedLettersArr; private ArrayList<Character> lettersHidden; private ArrayList<String> words; private ArrayList<String> creatureList; // AnimationDrawables private AnimationDrawable waterAnimation; private AnimationDrawable foodAnimation; private AnimationDrawable treatAnimation; private AnimationDrawable heartAnimation; private AnimationDrawable butterAnimation; // Displays private Display display; // Points private Point size; // ObjectAnimators private ObjectAnimator creatureAnimator; // Toasts Toast eventToast; Toast nopeToast; Toast correctToast; @Override protected void onStart(){ super.onStart(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ---------------------------- // myPet = new Pet(); // Displays size = new Point(); display = getWindowManager().getDefaultDisplay(); display.getSize(size); }
activity_main布局代码
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg" android:orientation="vertical" android:layout_gravity="center_horizontal" android:id="@+id/mainall" tools:context=".MainActivity"> <ImageView android:id="@+id/foodbowl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/bottomstuff" android:layout_marginLeft="20sp" android:layout_marginRight="20sp" android:background="@drawable/food1" tools:ignore="ImageContrastCheck" /> <ImageView android:id="@+id/waterbowl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/bottomstuff" android:layout_toEndOf="@id/foodbowl" android:layout_toRightOf="@id/foodbowl" android:background="@drawable/water1" tools:ignore="ImageContrastCheck"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:background="@drawable/heart0" android:id="@+id/heartimageview"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ball" android:visibility="gone" android:layout_alignParentLeft="true" android:layout_marginLeft="100sp" android:layout_centerInParent="true" android:background="@drawable/ball" android:layout_alignParentStart="true" android:layout_marginStart="100sp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/feather" android:visibility="gone" android:layout_alignParentRight="true" android:layout_marginRight="50sp" android:layout_marginLeft="50sp" android:layout_centerInParent="true" android:background="@drawable/feather" android:layout_alignParentEnd="true" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/creatureimageview" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center_horizontal" android:background="@drawable/topinfo" android:baselineAligned="false"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1.0"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:text="@string/age" android:id="@+id/agetext"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:id="@+id/ageinttext"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1.0"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:text="@string/hunger" android:id="@+id/hungertext"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:id="@+id/hungerinttext"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1.0"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:text="@string/water" android:id="@+id/watertext"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingLeft="2sp" android:paddingRight="2sp" android:textColor="@color/white" android:textSize="16sp" android:id="@+id/waterinttext"/> </LinearLayout> </RelativeLayout>
问题原因
从错误栈可直接定位:崩溃发生在MainActivity.java第286行,是调用了未初始化的ImageView对象的getBackground()方法,触发空指针异常。
你在MainActivity中声明了多个ImageView成员变量(如foodImg、waterImg、heartImage等),但在onCreate方法里没有通过findViewById将这些变量与布局中对应的控件绑定。布局里的控件ID为foodbowl、waterbowl、heartimageview,代码中直接调用未初始化的ImageView方法,必然抛出空指针。
此前运行正常可能是因为之前的代码包含初始化逻辑,或是某次修改后误删了这部分代码,重启后问题才暴露。
解决方法
- 初始化ImageView变量:在
onCreate方法中setContentView(R.layout.activity_main);之后,添加对应ImageView的初始化代码,示例:// 绑定布局中的foodbowl控件 foodImg = findViewById(R.id.foodbowl); // 绑定布局中的waterbowl控件 waterImg = findViewById(R.id.waterbowl); // 绑定布局中的heartimageview控件 heartImage = findViewById(R.id.heartimageview); // 其他需要调用方法的ImageView同理,逐一绑定 - 检查所有控件绑定:遍历代码中所有调用了方法的ImageView成员变量,确保每个都完成布局绑定,避免遗漏。
- 添加空判断(可选):在调用
getBackground()等方法前添加空判断,防止意外空指针:if (foodImg != null) { Drawable bg = foodImg.getBackground(); // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Grunteck
相关产品推荐
相关产品推荐

