【问题标题】:app crashed when trying to call BufferedReader.readLine()尝试调用 BufferedReader.readLine() 时应用程序崩溃
【发布时间】:2016-04-14 23:19:41
【问题描述】:

我正在开发一个必须从文件中解析文本的 android 应用程序。

我的 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 的一些解决方案,但没有运气。这是我得到的错误堆栈跟踪中的一个 sn-p。

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 上开发

【问题讨论】:

  • 这是因为你在捕捉到FileNotFoundException 之后继续,尽管buffer 从未被设置。
  • 找不到文件时无法初始化您的缓冲区。确保在发生这种情况时中止所有文件读取。
  • FileNotFoundException中尝试return null;
  • 如果您在 Android 设备上运行代码,那么为什么要尝试从本地计算机读取文件?设备上不存在该路径。

标签: java android bufferedreader


【解决方案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 项目中找到该文件路径。然后,正如 cmets 中所指出的,您没有正确处理异常并继续尝试读取流。

【讨论】:

  • 我在使用 OS X 很抱歉没有澄清。我还是会试试这个。
  • 是的,操作系统无关紧要,我只是提供了一个示例。关键是,您的资源需要位于您的项目包中,在您的资产文件夹或原始文件夹中。
【解决方案2】:

有几点:

  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;

【讨论】:

  • 真正的问题是设备上根本不存在该文件。
  • 同意@cricket_007,但 NoChin 已经指出了这一点。我试图阻止未来的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
相关资源
最近更新 更多