我正在开发一个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"
现在,为了尝试解决这个问题,我在stack和网上看了很多帖子,并尝试使用了一些来自this和this的解决方案,但都没有成功。这是我得到的错误堆栈跟踪中的一个片段。
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上开发
看起来您正试图将本地(可能是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项目中找不到该文件路径。然后,正如评论中所指出的,您没有正确处理异常,并继续尝试读取流。
两件事:
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;