- PR -

StringTokenizerの使用がうまくいきません(Nullが動作しない?)

投稿者投稿内容
Oregonian
会議室デビュー日: 2004/02/25
投稿数: 15
投稿日時: 2004-03-14 18:23
こんにちは。

早速質問なのですが下のコードを実行
しようとしてもLoop(?)になってしまい
ぬけられません。Nullが機能していないように
思われますが、解決方法がわかりません。
Readはどこまで読んで
いるかのためにつけました。
初めは、HasMoreTokens()をつけていなかった
のですが、過去ログよりつけなければいけないと
いうことがわかりつけてみたのですが、それでも
うまくいきません。

******コード**********
while ((s = in.readLine()) != null)
{

 System.out.println("Read 8");
 t = new StringTokenizer(s);
 int i=0;
 int j=0;
 System.out.println("Read 9");
 if(t.hasMoreTokens())
 {
i = Integer.parseInt(t.nextToken());
 }
 System.out.println("Read 10");
 if(t.hasMoreTokens())
 {
j = Integer.parseInt(t.nextToken());
 }
 System.out.println("Read 11");
 if(t.hasMoreTokens())
 {
weight[i][j] = weight[j][i] = Integer.parseInt(t.nextToken());
 }
 System.out.println("Read 12");

}

*******実行結果*******
1 2 6
Read 8
Read 9
Read 10
Read 11
Read 12
0 1 10
Read 8
Read 9
Read 10
Read 11
Read 12
0 2 21
Read 8
Read 9
Read 10
Read 11
Read 12

Read 8
Read 9
Read 10
Read 11
Read 12

これより後ENTERを押してもずっとこれが
繰り返されます。

なにか解決方法を教えてください。
よろしくお願いします。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-14 18:38
引用:

Oregonianさんの書き込み (2004-03-14 18:23) より:
これより後ENTERを押してもずっとこれが
繰り返されます。



in が参照しているのは System.in 等の標準入力ですか?
だとしたら、in.readLine() が null を返すことはありませんよ。
ループの条件を見直されてはいかがでしょうか。
Oregonian
会議室デビュー日: 2004/02/25
投稿数: 15
投稿日時: 2004-03-14 18:48
すみません、きちんと書いていなくて。
inはBufferedReaderです。

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-14 19:50
引用:

Oregonianさんの書き込み (2004-03-14 18:48) より:
すみません、きちんと書いていなくて。
inはBufferedReaderです。

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));



この場合 System.in をラップしているだけですので、同じ事です。

〔追記〕
「in が参照しているのは・・・」 というのは妥当な表現ではありませんでしたね。

[ メッセージ編集済み 編集者: でゅうく 編集日時 2004-03-14 19:53 ]
Oregonian
会議室デビュー日: 2004/02/25
投稿数: 15
投稿日時: 2004-03-14 20:52
すみません、同じことですね。
理解力に乏しくて(笑)。

とりあえず、直接プログラム上に
書くことで解決はできるのですが、
キーボードでの入力は無理なんでしょうか?

ループの条件は変えようと思ったのですが
どう変えてよいのかわかりません。
このループではグラフのデータを入力しており、
いつループを終わらせるかという条件の設定が
難しいです。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-14 21:21
引用:

Oregonianさんの書き込み (2004-03-14 20:52) より:
とりあえず、直接プログラム上に
書くことで解決はできるのですが、
キーボードでの入力は無理なんでしょうか?

ループの条件は変えようと思ったのですが
どう変えてよいのかわかりません。
このループではグラフのデータを入力しており、
いつループを終わらせるかという条件の設定が
難しいです。


キーボードでの入力が無理という事はありませんよ。
ループ条件が難しいのであれば、end 等と入力したらグラフデータの入力が終わりというように、仕様変更してはいかがですか?
会議室デビュー日: 2004/03/13
投稿数: 5
投稿日時: 2004-03-15 11:56
引用:

Oregonianさんの書き込み (2004-03-14 20:52) より:

ループの条件は変えようと思ったのですが
どう変えてよいのかわかりません。


終了条件を変えなくも、EOF を渡すことで readLine() が null を返し、ループを終了させることができます。

EOF を渡す方法は OS により異なりますが、一般的には、Windows 系の OS なら Ctrl-Z、UNIX 系の OS なら Ctrl-D を使います。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-15 15:17
あぁ! EOF 渡せましたね。
うっかりしてました。ごめんなさい。

注意点としては、Eclipse 等の IDE 上で実行すると、Ctrl-Z では EOF が渡せません。

スキルアップ/キャリアアップ(JOB@IT)