2016-04-14 8 views
0

ich auf einem Android App arbeite, die Text aus einer Datei zu analysieren hat.App stürzt ab, wenn BufferedReader.readLine zu nennen versuchen()

Ich habe die folgende Methode in meiner Parser.java Klasse:

private String getText(String fileName) { 
     BufferedReader buffer = null; 
     File file = new File(fileName); 
     try{ 
      buffer = new BufferedReader(new FileReader(file)); 
     } 
     catch (FileNotFoundException e){ 
      System.out.println("Could not find file" + fileName); 
     } 

     String everything = null; 
     try{ 
      StringBuilder builder = new StringBuilder(); 
      String line = null; 

      while ((line = buffer.readLine()) != null){ 
       builder.append(line); 
       builder.append(System.lineSeparator()); 
       line = buffer.readLine(); 
      } 
      everything = builder.toString(); 
      //buffer.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     finally { 
      if ((buffer != null)) { 
       try { 
        buffer.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return everything; 
    } 

ich ein Problem bin immer, wenn es einen Anruf an die buffer.readLine() -Methode in der while-Schleife ist.

ich in der folgenden Pfad Info passieren ist das File-Objekt so:

"/Users/aa/Desktop/parser.txt" 

Jetzt habe ich an zahlreichen Beiträgen auf dem Stapel und Online, um sah dies zu versuchen und zu lösen, und haben versucht, ein paar Lösungen mit von this und this hatten aber kein Glück. Dies ist ein Ausschnitt aus dem Fehler-Stack-Trace, den ich bekomme.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.BufferedReader.readLine()' on a null object reference 
at com.example.allanaraujo.parser.Parser.getText(Parser.java:40) 
at com.example.allanaraujo.parser.Parser.parse(Parser.java:19) 
at com.example.allanaraujo.parser.OpenDocument.uploadButton(OpenDocument.java:62) 
at java.lang.reflect.Method.invoke(Native Method)  
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
at android.view.View.performClick(View.java:5198)  
at android.view.View$PerformClick.run(View.java:21147)  
at android.os.Handler.handleCallback(Handler.java:739)  
at android.os.Handler.dispatchMessage(Handler.java:95)  
at android.os.Looper.loop(Looper.java:148)  
at android.app.ActivityThread.main(ActivityThread.java:5417)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

Ich bin sicher, dass der Pfad der Datei korrekt ist, weil ich es während des Debuggens überprüft. Ich bin mir nicht sicher, was ich hier noch überlegen sollte.

EDIT: ich auf OS X nicht Windows oder Linux entwickle

+1

Es ist, weil Sie nach dem Fang des 'FileNotFoundException' fortsetzen, trotz' buffer' nie gesetzt wird. –

+0

Ihr Puffer kann nicht initialisiert werden, wenn die Datei nicht gefunden werden kann. Stellen Sie sicher, dass Sie alle Dateilesevorgänge abbrechen, wenn dies geschieht. – f1sh

+0

Versuchen Sie, 'return null;' im 'FileNotFoundException' –

Antwort

1

Es sieht aus wie in einem lokalen (wahrscheinlich Windows) Dateipfad zu Ihrem Gerät oder Emulator zu passieren versuchen.

"/Users/aa/Desktop/parser.txt"

Das wird nicht funktionieren. Sie müssen diese Datei in Ihrem Android-Projekt haben. Sie können es in Ihrem Vermögen Ordner speichern und darauf zuzugreifen wie folgt aus:

AssetManager manager = context.getAssets(); 
InputStream input = manager.open("parser.txt"); 

Oder Sie können es in Ihre RAW-Ordner abgelegt und greifen Sie wie folgt aus:

InputStream input = context.getResources().openRawResource(R.raw.parser);

Der Grund, Sie werden immer Der NULL-Wert in Ihrem BufferedReader ist, weil das System diesen Dateipfad in Ihrem Android-Projekt nicht finden kann. Und dann, wie in den Kommentaren erwähnt, behandeln Sie die Ausnahme nicht korrekt und versuchen weiterhin, den Stream trotzdem zu lesen.

+0

Ich verwende OS X Entschuldigung für die Unklarheit. Ich werde das immer noch versuchen. – Anderology

+1

Ja, das Betriebssystem spielt keine Rolle, ich habe nur ein Beispiel gegeben.Der Punkt ist, dass sich Ihre Ressource in Ihrem Projektpaket befinden muss, entweder in Ihrem Asset-Ordner oder in Ihrem RAW-Ordner. – NoChinDeluxe

1

Ein paar Dinge:

while ((line = buffer.readLine()) != null){ 
    builder.append(line); 
    builder.append(System.lineSeparator()); 
    line = buffer.readLine(); //remove this line 
    } 

Sie müssen die Kommentarzeile entfernen, wie Sie die Readline zweimal nennend. Wenn Sie den Puffer richtig initialisiert bekommen, werden Sie Zeilen überspringen.

Um gegen eine Null-Zeiger-Ausnahme zu schützen sollen Sie:

if(buffer == null) return "buffer not ready"; //or something like that. 
String everything = null; 
+1

Das eigentliche Problem ist, dass die Datei auf dem Gerät nicht existiert. –

+0

Vereinbart @ cricket_007, aber NoChin wies bereits darauf hin. Ich habe versucht, zukünftige Probleme abzuwehren. –

Verwandte Themen