2016-04-14 7 views
0

ファイルからテキストを解析する必要があるアンドロイドアプリを開発中です。アプリがBufferedReader.readLine()を呼び出そうとしたときにクラッシュしました

私は私のParser.javaクラスで、次の方法がありますwhileループ内buffer.readLine()メソッドの呼び出しがあるたびに、私は問題を取得しています

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

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

は今、私はこれを試してみて、解決するために、オンラインでのスタックとの数多くの記事を見てきた、といくつかのソリューションを使用して試してみました:私は、Fileオブジェクト次のパス情報を渡す

はこれです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)  

私がデバッグ中にチェックしたので、ファイルのパスが正しいと確信しています。私はここで何を考慮すべきか分かりません。

編集:私はあなたのデバイスまたはエミュレーターへのローカル(おそらくWindowsの場合)ファイルのパスを渡ししようとしているように見えたOS XではないWindowsまたはLinux

+1

にです。 –

+0

ファイルが見つからない場合は、バッファを初期化できません。それが起こったときにすべてのファイルの読み取りを中止することを確認してください。 – f1sh

+0

'FileNotFoundException'の' Return Null; 'を試してください –

答えて

1

に開発しています。

"/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

はい、OSは問題ではありません。私は例を提供していました。重要なことは、あなたのリソースは、プロジェクトパッケージ内、資産フォルダまたは生のフォルダのいずれかに配置する必要があることです。 – NoChinDeluxe

1

物事のカップル:

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

あなたは二回のreadLineを呼び出しているように、コメント行を削除する必要があります。バッファを適切に初期化すると、行がスキップされます。

あなたがすべきnullポインタ例外から保護するために:あなたが設定されていないされているんbuffer` `にもかかわらず、` FileNotFoundException`をキャッチした後に続けているため

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

本当の問題は、ファイルが単にデバイス上に存在しないことです。 –

+0

Agreed @ cricket_007だが、NoChinはすでにそれを指摘している。私は将来の問題を頭をおろそうとしていた。 –

関連する問題