简体   繁体   中英

NullPointerException when trying to save and restore instance state on rotation in Android

I'm doing an exercise where the app logs whenever the lifecycle functions are called (onStart, onResume, etc.). It all works until I try to implement the onSaveInstanceState wherein it tells me that I can't apply .getText() on a null object reference

Here is my code

private TextView creatCount;
private TextView createTime;
private TextView startCount;
private TextView startTime;
private TextView resumeCount;
private TextView resumeTime;
private TextView pauseCount;
private TextView pauseTime;
private TextView stopCOunt;
private TextView stopTime;
private TextView destroyCount;
private TextView destroyTime;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lifecycle);
    creatCount = (TextView)findViewById(R.id.create_count);
    createTime = (TextView)findViewById(R.id.create_time);
    increment(creatCount);
    timeStamp(createTime);

    if (savedInstanceState != null){
        creatCount.setText(savedInstanceState.getString("create_count"));
        createTime.setText(savedInstanceState.getString("create_time"));
        startCount.setText(savedInstanceState.getString("start_count"));
        startTime.setText(savedInstanceState.getString("start_time"));
        resumeCount.setText(savedInstanceState.getString("resume_count"));
        resumeTime.setText(savedInstanceState.getString("resume_time"));
        pauseCount.setText(savedInstanceState.getString("pause_count"));
        pauseTime.setText(savedInstanceState.getString("pause_time"));
        stopCOunt.setText(savedInstanceState.getString("stop_count"));
        stopTime.setText(savedInstanceState.getString("stop_time"));
        destroyCount.setText(savedInstanceState.getString("destroy_count"));
        destroyTime.setText(savedInstanceState.getString("destroy_time"));
    }
}

public void onStart(){
    super.onStart();
    startCount = (TextView)findViewById(R.id.start_count);
    startTime = (TextView)findViewById(R.id.start_time);
    increment(startCount);
    timeStamp(startTime);
}

public void onResume(){
    super.onResume();
    resumeCount = (TextView)findViewById(R.id.resume_count);
    resumeTime = (TextView)findViewById(R.id.resume_time);
    increment(resumeCount);
    timeStamp(resumeTime);
}

public void onPause(){
    super.onPause();
    pauseCount = (TextView)findViewById(R.id.pause_count);
    pauseTime = (TextView)findViewById(R.id.pause_time);
    increment(pauseCount);
    timeStamp(pauseTime);
}

public void onStop(){
    super.onStop();
    stopCOunt = (TextView)findViewById(R.id.stop_count);
    stopTime = (TextView)findViewById(R.id.stop_time);
    increment(stopCOunt);
    timeStamp(stopTime);
}

public void onDestroy(){
    super.onDestroy();
    destroyCount = (TextView)findViewById(R.id.destroy_count);
    destroyTime = (TextView)findViewById(R.id.destroy_time);
    increment(destroyCount);
    timeStamp(destroyTime);
}

public void increment(TextView view){
    String number = view.getText().toString();
    int count = Integer.parseInt(number);
    count++;
    view.setText(String.valueOf(count));
}

public void timeStamp(TextView view){
    String currentTime = DateFormat.getTimeInstance().format(new Date());
    view.setText(currentTime);
}

public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putString("create_count", creatCount.getText().toString());
    savedInstanceState.putString("create_time", createTime.getText().toString());
    savedInstanceState.putString("start_count", startCount.getText().toString());
    savedInstanceState.putString("start_time", startTime.getText().toString());
    savedInstanceState.putString("resume_count", resumeCount.getText().toString());
    savedInstanceState.putString("resume_time", resumeTime.getText().toString());
    savedInstanceState.putString("pause_count", pauseCount.getText().toString());
    savedInstanceState.putString("pause_time", pauseTime.getText().toString());
    savedInstanceState.putString("stop_count", stopCOunt.getText().toString());
    savedInstanceState.putString("stop_time", stopTime.getText().toString());
    savedInstanceState.putString("destroy_count", destroyCount.getText().toString());
    savedInstanceState.putString("destroy_time", destroyTime.getText().toString());

    super.onSaveInstanceState(savedInstanceState);
    }
}

All the default text values are in the xml and set to "0"

And here's the logcat

02-02 08:29:26.971 24397-24397/com.example.jmcervantes02.jan_24 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.jmcervantes02.jan_24, PID: 24397
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
                                                                                  at com.example.jmcervantes02.jan_24.LifecycleActivity.onSaveInstanceState(LifecycleActivity.java:115)
                                                                                  at android.app.Activity.performSaveInstanceState(Activity.java:1482)
                                                                                  at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1301)
                                                                                  at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4625)
                                                                                  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3935)
                                                                                  at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4000)
                                                                                  at android.app.ActivityThread.-wrap25(ActivityThread.java)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:163)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6342)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

Ok, first let's understand the Activity's life cycle. On this link you can check with more details. But for now:

Act. Launched -> onCreate -> onStart -> onResume -> Running...

Tip: Always set View's elements within the onCreate method on activities (or in case of using fragments, within the onCreateView method.

keep in mind the life cycle above, and look at your "onCreate" method. Can you realize that you are calling the .setText methods from TextView without even get their references?

    startCount.setText(savedInstanceState.getString("start_count"));
    startTime.setText(savedInstanceState.getString("start_time"));
    resumeCount.setText(savedInstanceState.getString("resume_count"));
    resumeTime.setText(savedInstanceState.getString("resume_time"));
    pauseCount.setText(savedInstanceState.getString("pause_count"));
    pauseTime.setText(savedInstanceState.getString("pause_time"));
    stopCOunt.setText(savedInstanceState.getString("stop_count"));
    stopTime.setText(savedInstanceState.getString("stop_time"));
    destroyCount.setText(savedInstanceState.getString("destroy_count"));
    destroyTime.setText(savedInstanceState.getString("destroy_time"));

Here you are setting text in no-referenced elements.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM