2014-02-23 4 views
0

/으로 표시된 줄에서 널 포인터 예외가 발생합니다. 여기 내 코드에 /가 있습니다. 저는 AssetManager를 찾는 데 2 ​​시간을 소비 했었습니다.하지만 AssetManager를 사용하는 방법 등은 있지만 여전히 null 인 이유를 파악할 수 없습니다. 컨텍스트와 리소스에서 getAssets()를 호출했지만 여전히 null이 발생합니다. 누구든지 나를 도울 수 있습니까? 감사합니다. .AssetManager null 포인터 예외

package com.hamc17.CatFacts; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Random; 

public class FactsActivity extends Activity{ 

Context context; 
Resources res; 

@Override 
public void onCreate(Bundle savedInstanceBundle){ 

    super.onCreate(savedInstanceBundle); 

    context = getApplicationContext(); 
    res = context.getResources(); 

    Button getFactButton = (Button) findViewById(R.id.getFactButton); 
    getFactButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Toast toastMessageOnClick = new Toast(FactsActivity.this); 
      toastMessageOnClick.setText(getFact()); 
      if((toastMessageOnClick.toString()).length()>50) 
      { 
       toastMessageOnClick.setDuration(10); 
      } 
      else 
      { 
       toastMessageOnClick.setDuration(Toast.LENGTH_LONG); 
      } 
      toastMessageOnClick.show(); 
     } 
    }); 
} 


    String[] factArray = getFactsFromTextFile().split(";"); 
    private String getFactsFromTextFile(){ 
/*Here*/ AssetManager assMan = context.getAssets(); 
     try{ 
      BufferedReader buff = new BufferedReader(new InputStreamReader(assMan.open("facts.txt"))); 
      String line; 
      StringBuilder build = new StringBuilder(); 
      while((line = buff.readLine()) != null) 
      { 
       build.append(line).append(System.getProperty("line.seperator")); 
      } 
      return build.toString(); 
     } 
     catch (IOException e) 
     { 
      Toast toastMessage = new Toast(getApplicationContext()); 
      toastMessage.setText(e.toString() + "\n Whoops, there was an error! "); 
      toastMessage.show(); 
      return ""; 
     } 
     finally 
     { 
      try{ 
       assMan.close(); 
      } 
      catch (Exception e) 
      { 
       //Whatever Trevor 
      } 
     } 
    } 

private String getFact(){ 

    String randomFactString = ""; 
    int factCount = factArray.length; 

    Random rng = new Random(); 
    int randomNum = rng.nextInt()*factCount; 

    randomFactString = factArray[randomNum]; 

    return randomFactString; 
} 

}

답변

4

당신은 setContentView(R.layout.mylayout);

@Override 
public void onCreate(Bundle savedInstanceBundle){ 
    super.onCreate(savedInstanceBundle); 
    setContentView(R.layout.mylayout); 
    Button getFactButton = (Button) findViewById(R.id.getFactButton); 

findViewById 현재 팽창 레이아웃에 ID를 가진 자원을 찾습니다 누락되었습니다. 그래서 당신은 당신이) (단지 getBaseContext를 사용하는 작업의 컨텍스트를 얻기 위해 대신 로컬 변수를 만드는

res = getResources(); 
0

을 사용할 수 있습니다 초기화 전망

또한

을하기 전에 활동에 대한 레이아웃의 내용을 설정해야합니다; 컨텍스트에 대한 참조를 가져올 때마다

그래서 대신이 같은 :

AssetManager assMan = getBaseContext().getAssets();

+0

그리고 @Raghunandan이 옳다, 당신은 내가 발견 한 당신의 활동 –

+0

에 대한보기를 설정해야하는이 때마다 호출 라이프 사이클 및 화면 회전에 따라 것입니다 참조 할게. –