2016-08-04 60 views
0

Wir haben eine Java-Anwendung und konvertieren es in Android. Wir müssen eine Bin-Datei mit dem Namen "en-sent.bin" lesen, aber in Android gibt es eine Null-Pointerexpektion. Ich habe die bin-Datei in den Ordner "Assets" des Projekts gestellt und habe mit AssetManagers durcheinander gebracht, aber nichts hat funktioniert. ModelIn und model variablse sind immer null, wodurch der sentenceDetector eine nullpointerexception zurückgibt. Ich benutze eine Apache-Satzdetektor-Bibliothek, die diese Bin-Datei benötigt, um zu funktionieren.Nullpointer Ausnahme von der Änderung von Java zu Android

Hier ist unser Original-Code (von Java-Anwendung):

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

    //initializes sentence detector 
    SentenceDetectorME sentenceDetector = new SentenceDetectorME(model); 
    String[] sentencesTemp = sentenceDetector.sentDetect(article); 

Stapelüberwachung:

08-04 10:11:09.755 10247-10247/com.gigstudios.newssummary W/System.err: java.io.FileNotFoundException: en-sent.bin: open failed: ENOENT (No such file or directory) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:452) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:76) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:103) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.WordCounter.makeSentences(WordCounter.java:52) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.Article.<init>(Article.java:19) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.ArticleReceiver.receiveNewsArticles(ArticleReceiver.java:87) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.ArticleReceiver.<init>(ArticleReceiver.java:37) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.MainActivity.fetchNews(MainActivity.java:114) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.gigstudios.newssummary.MainActivity$1.run(MainActivity.java:52) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at android.os.Handler.handleCallback(Handler.java:746) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at android.os.Looper.loop(Looper.java:148) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5443) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at libcore.io.Posix.open(Native Method) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:438) 
08-04 10:11:09.756 10247-10247/com.gigstudios.newssummary W/System.err:  ... 15 more 
08-04 10:11:09.757 10247-10247/com.gigstudios.newssummary D/AndroidRuntime: Shutting down VM 
08-04 10:11:09.757 10247-10247/com.gigstudios.newssummary E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.gigstudios.newssummary, PID: 10247 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] opennlp.tools.sentdetect.SentenceDetectorME.sentDetect(java.lang.String)' on a null object reference 
                       at com.gigstudios.newssummary.WordCounter.makeSentences(WordCounter.java:56) 
                       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) 
+2

Mögliche Duplikat von [Datei aus Assets lesen] (http://StackOverflow.com/Questions/9544737/Read-File- from-assets) –

Antwort

1

Sie sollten en-sent.bin in /res/raw/en_sent.bin haben (Anmerkung Sie den Strich zu einem Unterstrich wird sich ändern müssen .) Dann ersetzen

 modelIn = new FileInputStream("en-sent.bin"); 

mit

 modelIn = getResources().openRawResource(R.raw.en_sent); 

Dies wird vorausgesetzt, dass Sie von einem Activity anrufen. Wenn Sie von einem Fragment aus anrufen, müssen Sie zunächst eine Context erhalten, dh getActivity().getResources() ...

+0

Vielen Dank! Arbeitete perfekt und viel einfacher als das, was alle anderen sagten. – Tdonut