簡體   English   中英

嘗試調用BufferedReader.readLine()時應用崩潰

[英]app crashed when trying to call BufferedReader.readLine()

我正在研究必須解析文件中文本的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()方法時,我都會遇到問題。

我通過以下路徑信息傳遞File對象是這樣的:

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

現在,我已經看了看堆了許多帖子,並在網上以試圖解決這個問題,並使用從幾個解決方案已經嘗試這個這個 ,但有沒有運氣。 這是我得到的錯誤堆棧跟蹤的摘錄。

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上獲取空值,是因為系統無法在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM