2016-04-14 150 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已经指出。我试图阻止未来的问题。 –

相关问题