【问题标题】:InputStream Always returns nullpointerexceptionInputStream 总是返回空指针异常
【发布时间】:2016-12-09 18:58:20
【问题描述】:
    SentenceModel model = null;
    InputStream modelIn = null;

    AssetManager assManager = context.getAssets();

    try {
        modelIn = assManager.open("en-sent.bin");
        model = new SentenceModel(modelIn);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (modelIn != null) {
            try {
                modelIn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //initializes sentence detector
    SentenceDetectorME sentenceDetector = new SentenceDetectorME(model);

//Stacktrace 
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err: java.io.FileNotFoundException: en-sent.bin
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at android.content.res.AssetManager.openAsset(Native Method)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:313)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:287)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.WordCounter.makeSentences(WordCounter.java:35)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.Article.<init>(Article.java:19)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.ArticleReceiver.receiveNewsArticles(ArticleReceiver.java:87)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.ArticleReceiver.<init>(ArticleReceiver.java:37)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.MainActivity.fetchNews(MainActivity.java:114)
08-03 14:25:23.842 27210-27210/com.gigstudios.newssummary W/System.err:     at com.gigstudios.newssummary.MainActivity$1.run(MainActivity.java:52)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at android.os.Handler.handleCallback(Handler.java:746)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at android.os.Looper.loop(Looper.java:148)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5443)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-03 14:25:23.843 27210-27210/com.gigstudios.newssummary D/AndroidRuntime: Shutting down VM
08-03 14:25:23.844 27210-27210/com.gigstudios.newssummary E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.gigstudios.newssummary, PID: 27210
                                                                            java.lang.NullPointerException: Attempt to invoke virtual method 'opennlp.tools.sentdetect.SentenceDetectorFactory opennlp.tools.sentdetect.SentenceModel.getFactory()' on a null object reference
                                                                                at opennlp.tools.sentdetect.SentenceDetectorME.<init>(SentenceDetectorME.java:86)
                                                                                at com.gigstudios.newssummary.WordCounter.makeSentences(WordCounter.java:50)
                                                                                at com.gigstudios.newssummary.Article.<init>(Article.java:19)
                                                                                at com.gigstudios.newssummary.ArticleReceiver.receiveNewsArticles(ArticleReceiver.java:87)
                                                                                at com.gigstudios.newssummary.ArticleReceiver.<init>(ArticleReceiver.java:37)
                                                                                at com.gigstudios.newssummary.MainActivity.fetchNews(MainActivity.java:114)
                                                                                at com.gigstudios.newssummary.MainActivity$1.run(MainActivity.java:52)
                                                                                at android.os.Handler.handleCallback(Handler.java:746)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

我已经尝试解决这个问题几个小时了,但一无所获。在上面的代码示例中,模型始终为空,并且 en-sent.bin 文件似乎没有被读入 modelIn 对象。我的 bin 文件当前位于 assets 文件夹中。非常感谢任何帮助。

【问题讨论】:

  • 请编辑您的问题并发布与您的异常相关的 Java 堆栈跟踪。
  • 请在问题上添加堆栈跟踪。
  • @Julian 我添加了堆栈跟踪。
  • @Jared en-sent.bin 在您的应用程序的根目录中吗?还是在文件夹中?
  • @Julian 它与 .gradle、.idea、.app 等文件夹一起位于一个名为 assets 的文件夹中

标签: java android nullpointerexception inputstream assets


【解决方案1】:

我找到了一个简单的解决方案!我将 bin 文件放在“原始”目录中,然后...

代替:

        modelIn = assManager.open("en-sent.bin");
        model = new SentenceModel(modelIn);

用途:

        modelIn = context.getResources().openRawResource(R.raw.en_sent);
        model = new SentenceModel(modelIn);

完美运行!

【讨论】:

    【解决方案2】:

    你需要:

        BufferedReader reader = null;
    StringBuilder sbuilder = new StringBuilder();
        try {
            reader = new BufferedReader(
                new InputStreamReader(getAssets().open("en-sent.bin")));
    
            // read
            String mLine; 
            while ((mLine = buffer.readLine()) != null) {
                        sbuilder.append(mLine);
            }
        } catch (IOException e) {
    //log
        } finally {
            if (reader != null) {
                 try {
                     reader.close();
                 } catch (IOException e) {
     //log
                 }
            }
        }
    

    【讨论】:

    • 请解释他们为什么需要这样做,以及这与他们在当前代码中看到的异常有何关系。
    • @Jason 什么是“sbuilder”和“buffer”?我不明白如何在我的代码中实现这一点。
    • 我已经编辑了代码,如果你想像你的例子一样打开一个资产文件到 InputStream,InputStream modelIn = null; AssetManager assManager = context.getAssets(); modelIn = assManager.open("en-sent.bin");您需要使用 InputStreamReader 读取它在 sbuilder 中,您拥有从文件到字符串的所有数据,以便您可以读取它;
    • @Jason 我的代码仍然无法正常工作。我不知道如何将我的 modelIn 和模型变量与此代码合并。我想我需要一个 FileInputStream 但这段代码给了我一个 StringBuilder。它也无法归档看起来像的jar文件。
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多