2017-01-07 39 views
0

だから私持っている人についてのデータを持っており、それらがで区切られTXTファイル「;」:塗りつぶしリスト

Person1;ABC;abc;123 
Person2;DEF;def;456 

そして私は4つのプライベート変数を持つクラスの人々を持っている彼らのデータおよび対応するコンストラクタ。

次のコード

try { 
      Scanner s = new Scanner(new File("People_data.txt")); 
      while (s.hasNextLine()) { 

       String[] split = s.nextLine().split(";"); 

       // TODO: make sure the split has correct format 
       people.add(new People(split[0], split[1], split[2], split[3])); 

      } 
     } catch (FileNotFoundException ex) { 
      System.out.println("No file found"); 
      Logger.getLogger(City.class.getName()).log(Level.SEVERE, null, ex); 
     } 

戻りjava.lang.ArrayIndexOutOfBoundsException:3.現在、いくつかの同様の問題が他の質問ではありますが、答えとしては非常に具体的な何もありません。私はそれらの答えからコードを修正しようとしましたが、できませんでした。私は誰かがJavaの問題が何であるかを述べるのではなく、このような状況で変更された作業コードを提示したいと思います。ありがとう。

+2

'split'にあるものを出力するforループを追加してみてください。それで、欠けているものが分かります。何らかの理由であなたの 'split'配列がインデックス3にならないようです。 – misaka

+2

あなたが読んでいることは、あなたが読んでいるとは思わない。問題を再現できません。ファイル "People_data.txt"はどこにありますか?あなたのJavaソースファイルはどこにありますか?あなたはどうしているのですか? – Tunaki

答えて

1

ファイルに空白行が含まれているか、取得しているデータ行に実際にすべてのデータが含まれていないと、この問題が発生する可能性があります。最初のものがあなたのジレンマを引き起こしている可能性が最も高いです。これは、ファイルから読み込んだものをString変数に置き、少なくとも1つの妥当性テストを実行することを常にお勧めします。データが含まれています。最終的にNull文字列( "")である空白行を分割すると、Peopleクラスに必要な4つの要素の代わりに1つのNull String要素しか含まれないため、ArrayIndexOutOfBoundsExceptionが生成されます。 split []配列内に存在しないインデックスを提供しています。

はこのようなものにするためにあなたのコードを設定し、あなたが最も可能性の高い大丈夫:は、(それが混乱を減らし、私は常に変数名のメソッド名を使用しないよう注意してください):コードで

try { 
    Scanner s = new Scanner(new File("People_data.txt")); 
    while (s.hasNextLine()) { 
     String line = s.nextLine(); 
     // Make sure line is not blank... 
     if (!line.equals("")) { 
      String[] split = line.split(";"); 
      // TODO: make sure the split has correct format 
      if (split.length == 4) { 
       people.add(new People(split[0], split[1], split[2], split[3])); 
      } 
      else { 
       // Do what you want if data is incomplete. 
      } 
     } 
    } 
} catch (FileNotFoundException ex) { 
    System.out.println("No file found"); 
    Logger.getLogger(City.class.getName()).log(Level.SEVERE, null, ex); 
} 

上記の2つのチェックを行います。最初に、ファイルから読み込んだ行に、処理する前に実際にデータが含まれていることを確認します。第二に、我々は人にそれを適用する前にsplit []配列内で利用できる十分なデータ要素があることを確認します。

+0

編集前の最初のコードがうまくいきました。これも機能します。 txtファイルのフォーマットが適切であれば、私の場合でも動作します。良い説明。 – Vanus

+0

もう少し追加して、データのチェックが役立つことを示しました。それがあなたを助けてくれてうれしいです。 – DevilsHnd