2014-02-25 5 views
0

내 코드가 Activity 클래스의 onSaveInstanceState 메서드로 만든 키/값 쌍의 값에 액세스하려고하면 NullPointerException이 발생합니다.savedInstanceState 번들 NullPointerException

나는 브레이크 포인트를 설정하고 내 번들이 null이 아니며 키/값에 대한 참조를 포함한다는 사실을 알고 있습니다. 나는이 런타임 오류가 나는 이유를 이해하지 못한다. 여기 내 코드는 여기 onSaveInstanceState

@Override 
protected void onSaveInstanceState(Bundle outState) { 

    int mPoints = winCount; 
    int hPoints = loseCount; 
    String reTextView = resultsTextView.getText().toString(); 
    String pTextView = pointsTextView.getText().toString(); 
    String roTextView = rollTextView.getText().toString(); 

    outState.putInt("MY_POINTS", mPoints); 
    outState.putInt("HOUSE_POINTS", hPoints); 
    outState.putString("RESULTS", reTextView); 
    outState.putString("POINTS", pTextView); 
    outState.putString("ROLL", roTextView); 

    super.onSaveInstanceState(outState); 
} 

하고위한 것은 내가 resultsTextView.setText 시작 줄에 런타임 오류를 얻을에서 onCreate 방법

// check if app just started or is being restored from memory 
     if (savedInstanceState == null) // the app just started running 
     { 
     winCount = 0; 
     loseCount = 0; 
     } 
     else 
     { 
     winCount = savedInstanceState.getInt("MY_POINTS"); 
     loseCount = savedInstanceState.getInt("HOUSE_POINTS"); 

     resultsTextView.setText(String.valueOf(savedInstanceState.getString("RESULTS"))); 
     pointsTextView.setText(String.valueOf(savedInstanceState.getString("POINTS"))); 
     rollTextView.setText(String.valueOf(savedInstanceState.getString("ROLL"))); 
     } 

에 상태를 복원하려면 코드입니다 ... 당신이 내 일을 모두 볼 수 여기가 savedInstanceState 번들의 내용은 디버그 모드

Bundle[{RESULTS=Roll Again, MY_POINTS=2, POINTS=Your Point is 8, 
HOUSE_POINTS=2, 
android:viewHierarchyState=Bundle[{android:[email protected], 
android:[email protected], 
android:[email protected]}], ROLL=You Rolled 
Easy Four}] 

에서 브레이크 포인트에서 검색 고리가 값을 가지고 흥미로운 것은 int 변수 (winCount 및 loseCount)에 NullPointerException 런타임 오류가 발생하지 않지만 문자열 값으로 가져 오는 것입니다. 어떤 도움을 주셔서 감사합니다.

업데이트 : 여기에 로그 고양이에서 전체 오류 로그는, 여기

W/dalvikvm(27797): threadid=1: thread exiting with uncaught exception (group=0x418b6700) 
E/AndroidRuntime(27797): FATAL EXCEPTION: main 
E/AndroidRuntime(27797): java.lang.RuntimeException: Unable to start activity ComponentInfo{…}: java.lang.NullPointerException 
E/AndroidRuntime(27797): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
E/AndroidRuntime(27797): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
E/AndroidRuntime(27797): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3740) 
E/AndroidRuntime(27797): at android.app.ActivityThread.access$700(ActivityThread.java:141) 
E/AndroidRuntime(27797): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
E/AndroidRuntime(27797): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(27797): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(27797): at android.app.ActivityThread.main(ActivityThread.java:5103) 
E/AndroidRuntime(27797): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(27797): at java.lang.reflect.Method.invoke(Method.java:525) 
E/AndroidRuntime(27797): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
E/AndroidRuntime(27797): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime(27797): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(27797): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(27797): at app.package.onCreate(AppName.java:68) 
E/AndroidRuntime(27797): at android.app.Activity.performCreate(Activity.java:5133) 
E/AndroidRuntime(27797): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
E/AndroidRuntime(27797): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
E/AndroidRuntime(27797): ... 12 more 

가합니다 (내 onCreat에 다른 블록()) 라인 (68)에 resultsTextView.setText ...이 많은 주석가가 전체 메서드를 보도록 요청했기 때문에 내 전체 onCreate 메서드. 희망이 도움이됩니다!

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

      // check if app just started or is being restored from memory 
      if (savedInstanceState == null) // the app just started running 
      { 
      winCount = 0; 
      loseCount = 0; 
      } 
      else 
      { 
      winCount = savedInstanceState.getInt("MY_POINTS"); 
      loseCount = savedInstanceState.getInt("HOUSE_POINTS"); 

      resultsTextView.setText(savedInstanceState.getString("RESULTS")); 
      pointsTextView.setText(savedInstanceState.getString("POINTS")); 
      rollTextView.setText(savedInstanceState.getString("ROLL")); 
      } 


     die1 = (ImageView) findViewById(R.id.imageView1); 
     die2 = (ImageView) findViewById(R.id.imageView2); 
     dealButton = (Button) findViewById(R.id.dealButton); 
     resetButton = (Button) findViewById(R.id.resetButton); 
     resultsTextView = (TextView) findViewById(R.id.resultsTextView); 
     myPointsTextView = (TextView) findViewById(R.id.myPointstTextView); 
     housePointsTextView = (TextView) findViewById(R.id.housePointsTextView); 
     pointsTextView = (TextView) findViewById(R.id.pointsTextView1); 
     rollTextView = (TextView) findViewById(R.id.rollTextView); 

     dealButton.setOnClickListener(dealButtonListener); 
     resetButton.setOnClickListener(resetButtonLinstener); 

     //on shake event 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mShakeDetector = new ShakeDetector(new OnShakeListener() { 

      @Override 
      public void onShake() { 
       game(rollDice()); 
      } 
     }); 


     resultsTextView.setTextColor(Color.BLACK); 
     myPointsTextView.setText(String.format("%s", winCount)); 
     housePointsTextView.setText(String.format("%s", loseCount)); 

    } 
+1

savedInstanceState.getString이 이미 String을 반환하기 때문에 String.valueOf를 제거 할 수 있습니다. – Niko

+1

여기에 예외 로그를 ​​붙여 넣을 수 있습니까? – alkber

+0

@Niko 처음에는 String.ValueOf가 없지만 동일한 런타임 오류가 발생했습니다. 이상한 성냥과 일치하지 않을 수 있다고 생각하여 추가했습니다. 나는 어느쪽으로도 일하지 않았다! – Zimex

답변

1

setText 메서드를 호출하기 전에 TextView을 초기화해야합니다. 그래서 onCreate는 다음과 같아야합니다 :

 setContentView(R.layout.activity); 

     die1 = (ImageView) findViewById(R.id.imageView1); 
     die2 = (ImageView) findViewById(R.id.imageView2); 
     dealButton = (Button) findViewById(R.id.dealButton); 
     resetButton = (Button) findViewById(R.id.resetButton); 
     resultsTextView = (TextView) findViewById(R.id.resultsTextView); 
     myPointsTextView = (TextView) findViewById(R.id.myPointstTextView); 
     housePointsTextView = (TextView) findViewById(R.id.housePointsTextView); 
     pointsTextView = (TextView) findViewById(R.id.pointsTextView1); 
     rollTextView = (TextView) findViewById(R.id.rollTextView); 

      // check if app just started or is being restored from memory 
      if (savedInstanceState == null) // the app just started running 
      { 
      winCount = 0; 
      loseCount = 0; 
      } 
      else 
      { 
      winCount = savedInstanceState.getInt("MY_POINTS"); 
      loseCount = savedInstanceState.getInt("HOUSE_POINTS"); 

      resultsTextView.setText(savedInstanceState.getString("RESULTS")); 
      pointsTextView.setText(savedInstanceState.getString("POINTS")); 
      rollTextView.setText(savedInstanceState.getString("ROLL")); 
      } 
... 
+0

의견을 말씀 드린 후 실제로 효과를 보았습니다. 이제는 원활하게 작동합니다. – Zimex

+0

이것은 제 답변에서 언급 한 것과 같습니다. 어떤 방법 으로든 좋은 일 – Triode

+0

@ RajeshCP Rajesh – Zimex