重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

下記のソースで
テキスト入出力を行う際でのご質問がございます。
最終配列がNULLの時と
文字がある場合のデータを入出力する際に

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at ExIO3.getValue(テスト.java:53)
at ExIO3.main(テスト.java:14)
というエラーが表示されます。
最終配列にすべて文字が存在する場合は問題ないのですが
こちらはBufferedReaderで
1レコードずつ読み込んでいるソースに問題があるのでしょうか?
アドバイスどうぞよろしくお願いします。


import java.io.*; //(1)入出力パッケージのインポート


import java.text.Normalizer;


class ExIO3 {
//mainメソッド
public static void main(String[] args) throws IOException {
ExIO3 object1 = new ExIO3();
//(1)抜出しメソッドgetValueと、
// ソートメソッドsortValueの呼出
object1.sortValue(object1.getValue());
}
//getValueメソッド
Reader getValue () throws IOException {
//(2)FileReaderオブジェクトcsvの生成
FileReader csv = new FileReader ("C:\\javasample\\テスト\\src\\テストin.txt");

//(3)BufferedReaderクラスでFileReaderクラスの
// オブジェクトcsvをラップ
BufferedReader in = new BufferedReader(csv);

//(4)PipedWriterオブジェクトpipeOutを生成
PipedWriter pipeOut = new PipedWriter();
//(5)PipedReaderオブジェクトpipeInを生成
PipedReader pipeIn = new PipedReader(pipeOut);
//(6)PrintWriterクラスでPipedWriterクラスの
// オブジェクトpipeOutをラップ
PrintWriter out = new PrintWriter("C:\\javasample\\テスト\\src\\テストout.txt");

//************************************************************************************************
//(7)入力テキストデータ
//************************************************************************************************
String line;
String[] arrayline;


Integer sequence_No =0 ; //行のカウンタ
//(8)読み込みソースがなくなるまでBufferedReaderで1行ずつ読み込み、
// 読み込みデータをprintlnメソッドで書き込み
while((line = in.readLine()) != null) {




sequence_No++; //連続番号生成
arrayline = line.split(",");

//======================================================
String A= arrayline[0] ;
String B = arrayline[1] ;


//======================================================

//************************************************************************************************
//(9)出力テキストデータ
//************************************************************************************************



顧客郵便番号_編集(A,out);
out.print(","); // ※

顧客住所_編集(B,out);
out.println(""); // ※




out.flush();
}

//(10)読み込みストリームのクローズ
in.close();

//(11)書き込みストリームのクローズ

out.close();

return pipeIn; //(12)pipeInオブジェクトのリターン
}


//************************************************************************************************
//顧客郵便番号_編集A1
//************************************************************************************************


private void 顧客郵便番号_編集(String a, PrintWriter out) {
// TODO 自動生成されたメソッド・スタブ


out.print(a.replaceAll(" ","").replaceAll(" ",""));

}


//************************************************************************************************
//顧客住所_編集B2
//************************************************************************************************

private void 顧客住所_編集(String b, PrintWriter out) {
// TODO 自動生成されたメソッド・スタブ

out.print(b);

}


//sortValueメソッド
void sortValue(Reader source) throws IOException {

}
}

A 回答 (4件)

>arrayline = line.split(",");



arrayline = line.split(",", 2);
もしくは
arrayline = line.split(",", -1);
としたらどうでしょうか。

詳しくはAPIを読んでみてください。
http://docs.oracle.com/javase/jp/7/api/java/lang … int)
    • good
    • 0
この回答へのお礼

ご回答どうもありがとございます。
配列が多い場合もありますので
arrayline = line.split(",", -1);で解決しました。
以前から、色々調べていたのですが
なかなか解決しなかったので
投稿してよかったです。
APIの方はブックマークに登録させていただきました。
今回はどうもありがとうございました。

お礼日時:2013/05/22 21:53

以下のような入力ファイルで試してみると良い。

3行目でカンマの無い行を拾ってエラーになる。

---ここから---
001-0010,北海道札幌市北区北十条西
001-0011,北海道札幌市北区北十一条西
001-0012北海道札幌市北区北十二条西
001-0013,北海道札幌市北区北十三条西
001-0014,北海道札幌市北区北十四条西
---ここまで---

以下のような入力ファイルでも同じ。3行目で空行を拾ってエラーになる。

---ここから---
001-0010,北海道札幌市北区北十条西
001-0011,北海道札幌市北区北十一条西

001-0013,北海道札幌市北区北十三条西
001-0014,北海道札幌市北区北十四条西
---ここまで---

で、質問者さんは

---ここから---
001-0010,北海道札幌市北区北十条西
001-0011,北海道札幌市北区北十一条西
001-0012,北海道札幌市北区北十二条西
001-0013,北海道札幌市北区北十三条西
001-0014,北海道札幌市北区北十四条西
---ここまで---

というファイルでは上手く行って

---ここから---
001-0010,北海道札幌市北区北十条西
001-0011,北海道札幌市北区北十一条西
001-0012,北海道札幌市北区北十二条西
001-0013,北海道札幌市北区北十三条西
001-0014,北海道札幌市北区北十四条西

---ここまで---

というファイルでは失敗する、と悩んでいたのですよ。

見て判るよね?最後の行が「空行で、カンマが入ってない、文字列の長さが0の行だ」って事が。
    • good
    • 0

String A= arrayline[0] ;


String B = arrayline[1] ;

の前に
判定処理を入れればいいだけかと
    • good
    • 0
この回答へのお礼

ありがとうございます。
色々な処理方法を調べていたのですが
なかなか解決せず投稿させていただきました。

お礼日時:2013/05/22 21:48

テキストファイルの最後の行が「空行」の場合、



while((line = in.readLine()) != null)

で、lineの内容は「null」ではなく「""」、つまり、長さ0の文字列になる。

その状態で

arrayline = line.split(",");

を行うと、lineの中に「,」が居ないので、arraylineは「要素数1の配列」になる。

その状態だと

String A= arrayline[0] ;

は成功するが

String B = arrayline[1] ;

は「要素番号が最大値を超える」ので「ArrayIndexOutOfBoundsException」のエラーになる。

当然だが、テキストファイルの途中に「,」が無い行が紛れ込んでいた時も、同じエラーが出る。

lineがnullの時にwhile文を終了するのは当然として、それ以外に「空行」や「カンマの居ない行」が現れたら、その行をスキップして次の行を処理するようにしないといけない。
    • good
    • 0
この回答へのお礼

ご説明どうもありがとうございます。
arrayline = line.split(",");で配列をカンマで
区切っていますので
症状はすぐに認識していたのですが
ソースの書き方が分かりませんでした。

お礼日時:2013/05/22 21:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!