2013-01-20 58 views
0

我試圖從服務獲取我的應用程序的資產,我得到nullpointexception。 我發現了一些關於它的文章,但我沒有得到我的錯誤。Android 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

這可能是由於您使用一個構造你的初始化的事實。服務和活動不使用普通的「使用構造函數」方法,而是通過intents與'startActivity()/ startService()'結合起來調用。然後他們在'onCreate()'中進行初始化 –

回答

0

下一次,請在此處指出哪一行是第41行。恕我直言,這 只是部分的代碼使堆棧跟蹤不可用

我認爲這個問題是在這裏:

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

如果assetManager.list(「tessdata」)返回一個空(有沒有tessdata),即空進入String file爲一個條目,然後你打電話

​​

如果"tessdata"不存在

所以將不存在,該解決方案可能是:

解決方案

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