2013-01-20 2 views
0

나는 서비스에서 내 애플 리케이션의 자산을 얻으려고하고있어 nullpointexception을 얻습니다. 나는 it.but에 대한 몇 가지 기사를 찾았지만, 내 실수는 어디서나. 의 예외입니다안드로이드 getAssets() 메소드가 NullPointerException을 던졌습니다

public class OCRService extends IntentService{ 

private static final String TAG = "OCRService"; 
public static final String DATA_PATH = Environment.getExternalStorageDirectory().toString() + "/SimpleAndroidOCR/"; 


public OCRService() { 
    super("OCRService"); 
    String path = new String(DATA_PATH + "tessdata/"); 
    File dir = new File(path); 
    if (!new File(path).exists() && !dir.mkdirs()) { 
     Log.e(TAG, "ERROR: Creation of directory " + path + " on sdcard failed"); 
     return; 
    } else { 
     Log.v(TAG, "Created directory " + path + " on sdcard"); 
     if (!(new File(DATA_PATH + "tessdata/" + "eng.traineddata")).exists()) { 
      try { 

       AssetManager assetManager = getAssets(); 
       for (String file : assetManager.list("tessdata")) { 
        InputStream in = assetManager.open("tessdata/" + file); 
        OutputStream out = new FileOutputStream(DATA_PATH + "tessdata/" + file); 
        byte[] buf = new byte[1024]; 
        int len; 
        while ((len = in.read(buf)) > 0) { 
         out.write(buf, 0, len); 
        } 
        in.close(); 
        out.close(); 
       } 
       Log.v(TAG, "Copying ocr traineddata sacceded"); 
      } catch (IOException e) { 
       Log.e(TAG, "Was unable to copy osr traineddata "+ e.toString()); 
      } 
     } 
    } 
} 

:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate service com.pc.droidhelper.services.OCRService: java.lang.NullPointerException 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2241) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4476) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101) 
    at com.pc.droidhelper.services.OCRService.<init>(OCRService.java:41) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1319) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2238) 
    ... 10 more 

당신이에 getAssets을 볼 수있는이 서비스에서 호출

는 어디 코드입니다. 거기에 컨텍스트가 있습니다. 나는 주요 활동에서 getAssets를 사용할 것이라고 읽었다. 제발 전화 내 이유, 차이점은 무엇입니까.

+1

. 서비스와 액티비티는 일반적인 "생성자 사용"접근법을 사용하지 않고, 대신에 startActivity()/startService()와 결합 된 Intents에 의해 호출됩니다. 그런 다음 그들은 onCreate()에서 초기화 작업을 수행합니다. –

답변

0

다음 번에 41 번째 줄을 지정하십시오. 이 이

내가 생각하는 문제 사용할 수 없게 스택 추적을 부분적인 코드를이었다 이럴 여기에 있습니다 : assetManager.list는 ("tessdata은")가 있다는 것을 (널 (null)을 반환

AssetManager assetManager = getAssets(); 
      for (String file : assetManager.list("tessdata")) { 
       InputStream in = assetManager.open("tessdata/" + file); 

경우) tessdata 아니, 널 (null)은 다음

InputStream in = assetManager.open("tessdata/" + file); 

를 호출하고, 하나 개의 항목으로 String file로 전환 "tessdata" 그래서

존재하지 않은 경우이 존재하지 않습니다, 솔루션이 될 수 있습니다

솔루션 그것 때문에 당신이 당신의 초기화에 대한 생성자를 사용한다는 사실에 아마

for (String file : assetManager.list("tessdata")) { 
if(file!=null){ 
       InputStream in = assetManager.open("tessdata/" + file); 
... 
    } 
}