こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

javaのStringデーターの読込みについて

javaのStringTokenizerを使用しました、ストリングデーターの読み取りに
ついて質問します。
入力ファイルの200.0から800.0の7個のデーターは読取ることが出来ます。
次の行の200.0を読込みますと、『str=st.nextToken();』でエラーになります。
Q1)このエラーの原因について、コメント頂けますと大変助かります。

//入力ファイル
200.0 300.0 400.0 500.0 600.0 700.0 800.0
200.0 2000.0 4000.0 110
//ファイルの読取コード
void fileIn_f_snd_chk_etc(){
String strX;
String str;
try{
File file = new File("c:\\TRSX700\\file_snd_chk_etc.txt");
if (myMsrCtlPanel.checkBeforeReadfile(file)){
BufferedReader bread = new BufferedReader(new FileReader(file));
int j=0;
while((strX = bread.readLine()) != null){
//<----String[] values = str.split(" * ",0);
StringTokenizer st=new StringTokenizer(strX," * ");
//======================
for(int i=0; i<7; i++){//ブランクは読み飛ばしている
str=st.nextToken();
f_snd_chk[i].setText(str);//fileIn_f_snd_chk_etc()
// System.out.print(f_snd_chk[i].getText()+" ");
}
// System.out.println("");
//ここまでは、正常読取
//======================
str=st.nextToken();//ここでエラーになる
f_imp_chk.setText(str);//fileIn_f_snd_chk_etc()
// System.out.print(f_imp_chk+" ");
//======================
str=st.nextToken();
f_dst_chk.setText(str);//fileIn_f_snd_chk_etc()
// System.out.print(f_dst_chk+" ");
//======================
str=st.nextToken();
f_fft_chk.setText(str);//fileIn_f_snd_chk_etc()
// System.out.print(f_fft_chk+" ");
//======================
str=st.nextToken();
key_data.setText(str);//fileIn_f_snd_chk_etc()
System.out.print("f_imp_chk="+f_imp_chk.getText()+" f_dst_chk="+f_dst_chk.getText()+" f_fft_chk="+f_fft_chk.getText()+" key_data="+key_data.getText());

}//while
bread.close();
}//if
else{
System.out.println("ファイルが見つからないか開けません");
}
}//try
catch(FileNotFoundException e){
System.out.println("FileNotFoundException: "+e);
}
catch(IOException e){
System.out.println("IOException: "+e);
}
System.out.println("file_inの終了");
}//fileIn_f_snd_chk_etc()
//以上

投稿日時 - 2015-08-16 12:56:26

QNo.9031156

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ファイルの1行目のデータしか読み込んでいない状態で、2行目以降のデータを st.nextToken() で読もうとするからです。while((strX = bread.readLine()) != null) の動きをきちんと把握してください。

strX = bread.readLine() を1回実行すると、strX にはファイルから読み込んだ1行のデータがセットされます。読み込んだ後、その行のデータを取得して処理していますが、ここまでは正常に行けますね。そのあと strX からさらに2行目を読もうとしていますが、そもそも strX には1行分しかデータが入っていないので、2行目を読もうすれば『そんなもの無いよ!』と怒られるのは当然です。

そもそもこのプログラム、StringTokenizer の使い方が全くおかしいです。きちんとマニュアルを読んで、機能を理解して使っていますか? プログラムは適当に組んでも動かないですよ。
https://docs.oracle.com/javase/jp/6/api/java/util/StringTokenizer.html

投稿日時 - 2015-08-16 13:35:02

あなたにオススメの質問