• ベストアンサー

コンパイルエラーについて。

今晩は。現在javaについて勉強しているのですが、 コンパイルエラーを解決することが出来ません。 プログラムの内容は好きな文字列を入力し、空白文字を取り除き出力するといったものです。 空白はindexOf()メソッドを使って探し出す。 空白削除はdeleteCharAt()メソッドを使って行う。 というのが条件です。 どなたかご回答おまちしております。 class bf2{ public static void main(String args[])throws IOException{ String t = "end"; String str = ""; int l; int i; int xx=0; String kuhaku = " "; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(!str.equals(t)){ System.out.print(">"); str = br.readLine(); if(str.equals(t)) break; l = str.length(); i=0; StringBuffer str2 = new StringBuffer(str); while(i<l){ xx = str2.indexOf(kuhaku); str2.deleteCharAt(xx); //こちらがコンパイルエラー会場です。 i++; System.out.println(str2); } } } } Exception in thread "main" java.lang.StringIndexOutOfBoundsException at java.lang.StringBuffer.deleteCharAt(Unknown Source)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

エラーが出ている行のひとつ上に、以下を追加してみてください。 if(xx <=0) break; str2.deleteCharAt(xx); のところで、処理が終わるまで正常にできていますが、最後にxxが負の数値になっています。 20行目:xx = str2.indexOf(kuhaku);のところで、空白がすでにないためxxに入る数値が-1になっています。 それで、str2.deleteCharAt(xx); の部分で、メソッド的には 「文字列の-1番目を消す」というありえない処理をしろと指令を受けて結果エラーが出ています。 この場合は、処理が最後まで終わった後に出るエラー(つまり、空白がなくなってから)なので、xxがマイナスになった際に、ループから抜けるように書き換えることを、ひとつの助言といたしました。 ご参考になれば、幸いです。

noname#39315
質問者

お礼

早速のご回答ありがとうございました。 急いで作ったプログラムだったのであらゆる状況を考えずに プログラムを作ってしまいました。 kuma_riderさんが指摘されたとおり空白が入力されなかったときの処理、 空白が全て除去されたときの処理を全く考えずに作ってしまいました。 タイムリミットが近いため今回は頭で考えてプログラムを作成していたのですが、余裕があるときはメモを取るなり、トレースするなどして 作って生きたいと思います(急いでいても後者のほうが確実かもしれません)。 本日はありがとうございました^^

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.3

ここのところ、いろいろな人に同じ発言を繰り返していますが、 Eclipse等の統合開発環境を入手されて、その上でプログラミング されることを強くお勧めします。 デバッガでエラー発生時のクラスや変数の中身が所望の値になっているか 等を自ら確認して修正する手段を身に付けられることが先決だと思います。 Eclipseは無料ですし、詳しい解説書も複数発行されていますので、 導入してみてはいかがでしょうか。

noname#39315
質問者

お礼

アドバイスありがとうございます >>ここのところ、いろいろな人に同じ発言を繰り返していますが, 同じ方が回答してくださるケースと言うのが多く大変申し訳なく思っています。(特に小さなミスによるもの) >>Eclipse等の統合開発環境を入手されて、その上でプログラミング されることを強くお勧めします。 そういうのがあるのは知っているのですが、敷居が高いものだと思い込んでいたので導入を断念したことがあります。 >>デバッガでエラー発生時のクラスや変数の中身が所望の値になっているか >>等を自ら確認して修正する手段を身に付けられることが先決だと思います。 学校のパソコンにはLinuxでコマンドを入力してデバッグをするものが ありますが、学校での授業時間が限られていることもあり 使ったことがありません。 >>Eclipseは無料ですし、詳しい解説書も複数発行されていますので、 >>導入してみてはいかがでしょうか。 ネットでも購入できますし、詳しい解説ものっているということなので 入門者向けの本を買う方向で導入を考えていきたいと思います。 ご親切にありがとうございました^^

すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

とりあえず、str2 に空白が見付からなかった場合の考慮は? そして indexOf で空白を探すなら int StringBuffer::indexOf(String str, int fromIndex); の方が良いのでは?

noname#39315
質問者

お礼

ご覧頂きありがとうございます。 deleteCharAt()、indexOf()の書式と使い方が分からなかったため ネットで検索しどのように使うのかと言うことを勉強してからつくりました。 このプログラムを作成する前koko_u_さんが仰られるindexOf(String str, int fromIndex); と言うような使い方はネットを一通り探しても のっていなかったため(これをキーワードにすればヒットするかもしれません)今回は上記のような記述方法にしました。 タイムリミットが近いため編集するということはできませんが、時間に余裕が出来たら indexOf(String str, int fromIndex); ←これはどのような働きをするメソッドなのかと言うことも学んでみたいと思います。 ご回答ありがとうございました^^

すると、全ての回答が全文表示されます。

関連するQ&A