机器人getAssets()方法抛出的NullPointerException(Android ge

2019-11-01 11:01发布

我试图从服务我的应用程序的资产,我得到nullpointexception。 我发现了几篇文章关于它。但是我不明白哪里我的错误。

哪里是代码:

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从服务调用。 和我有背景有。 我已阅读,我chould使用getAssets从主要活动。 请电话我为什么,有什么区别。

Answer 1:

接下来的时间,请注明这是行号41在这里。 恕我直言,这只是部分的代码使堆栈跟踪不可用

我认为这个问题是在这里:

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

如果assetManager.list(“tessdata”)返回一个空(没有tessdata ),即空进入String file为一个条目,然后你打电话

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

"tessdata/" + file ,如果不存在"tessdata"根本不存在

因此,该解决方案可能是:

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


文章来源: Android getAssets() method throws NullPointerException