2016-04-14 149 views
0

我正在從一個文件解析文本的Android應用程序工作。應用程序嘗試調用時崩潰BufferedReader.readLine()

我在Parser.java類下面的方法:

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; 
    } 

我得到的一個問題,每當有到while循環內的buffer.readLine()方法的調用。

我通過以下路徑信息的文件對象是這樣的:

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

現在我已經看了看棧和網絡,以試圖解決這個無數的帖子,並使用一些解決方案試圖從thisthis,但沒有運氣。這是我得到的錯誤堆棧跟蹤的片段。

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)  

我確定該文件的路徑是正確的,因爲我在調試時對其進行了檢查。我不知道我應該在這裏考慮什麼。

編輯:我在OS X而非Windows或Linux

+1

這是因爲你捕捉'FileNotFoundException'後繼續,儘管'buffer'從來沒有被設置。 –

+0

無法找到文件時,無法初始化緩衝區。確保在發生這種情況時中止讀取所有文件。 – f1sh

+0

嘗試在'FileNotFoundException'中返回null;' –

回答

1

開發它看起來像您正在嘗試在本地(可能是Windows)中的文件路徑到您的設備或模擬器通過。

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

這是行不通的。你必須在你的Android項目中擁有該文件。你可以把它放在你的資產的文件夾,並訪問它像這樣:

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

或者你可以把它放在你的原始文件夾和訪問它像這樣:

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

你所得到的理由BufferedReader上的null是因爲系統無法在Android項目中找到該文件路徑。然後,如評論中指出的那樣,您無法正確處理異常並繼續嘗試讀取流。

+0

林使用OS X抱歉不澄清。我仍然會嘗試這個。 – Anderology

+1

是的操作系統並不重要,我只是提供一個例子。問題是,您的資源需要位於您的項目包中,無論是在資產文件夾還是原始文件夾中。 – NoChinDeluxe

1

幾件事情:

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

您需要刪除註釋行,因爲你是調用的readLine兩次。當你確實得到正確初始化的緩衝區時,你會跳過行。

爲了防止一個空指針異常,你應該:

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

真正的問題是該文件根本不存在於設備上,但。 –

+0

同意@ cricket_007,但NoChin已經指出。我試圖阻止未來的問題。 –

相關問題