• ベストアンサー

while文の指定エラー

int beginIndex = 0; //現在のindex int endIndex = txt.length(); //最後のindex //while(txt.substring(beginIndex, endIndex).length() > 0){ out.println(txt.substring(beginIndex, endIndex).length()); beginIndex += 300; out.println(txt.substring(beginIndex, endIndex).length()); beginIndex += 300; out.println(txt.substring(beginIndex, endIndex).length()); beginIndex += 300; //} String型の変数txtの長さを読み込んで、beginIndexの値を300ずつ増やしていくソースなのですが、このようにすると結果が得られるのですが、 int beginIndex = 0; //現在のindex int endIndex = txt.length(); //最後のindex while(txt.substring(beginIndex, endIndex).length() > 0){ out.println(txt.substring(beginIndex, endIndex).length()); beginIndex += 300; } のようにwhileの部分のコメントを外し、txtの長さが0になるまで回そうとするとエラーが起きてしまいます。 while文の指定だとは思うのですが、どこがおかしいのか直し方がわかりません。 わかる方教えてください、よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

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

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

こんにちは。 どうやらsubstringにおいて、beginIndexが文字列より大きくなってしまった、及びbeginIndexがendIndexより大きくなったのが原因のようです。 while(txt.substring(beginIndex, endIndex).length() > 0){ 上記の行です。 while(beginIndex <= endIndex ){ このようにしてはどうかと思います。

bell_xxx
質問者

お礼

回答ありがとうございます。 実験的に300ずつ減らしたためこのようなエラーになってしまったようです。実際は最終的に丁度0になるようにもっと少なく減らす予定でしたが、beginIndex <= endIndex は思いつきもしませんでした。 こちらの方がよさそうなので使わしていただきます。 適切な回答ありがとうございました。本当に助かりました。

その他の回答 (1)

回答No.1

先ず、自分で対処できないエラーが出力されたときは全て貼り付けるようにしてください。 実行してみましたところ、string index outofbounds exception(インデックスの不正範囲)となりました。 つまり、txtの開始位置がおかしいというものです。 たとえば txt="abcdefghij" であれば、 (1)条件文 txt.substring(0,10).length()=10 となり真になる (2)txtの長さ "10" が出力される (3)beginIndex+=300; により beginIndex=300になる (4)txt.substring(300,10)となり文字列は10文字の長さしかないのに300を参照しようとする ->エラー 以上のようになります。

bell_xxx
質問者

お礼

回答ありがとうございます。 全て貼り付けたいのはやまやまなのですが、文字数制限と自分のソースが汚いので他の人にはわかりづらいかと思いまして、必要な部分だけを載せていました。 少ない情報の中で適切な回答ありがとうございます。 txt.lemgth()は1500くらいなので、大丈夫だと思ってましたが、whileで繰り返した時に最終的に超えてしまいエラーになるのですね。 ありがとうございました。

関連するQ&A

  • javaのwhile文について

    すいません再び質問です。 じゃんけんの問題です(0がグー、2がチョキ、5がパー、指の本数です) public class Sample9_2 { public static void main(String[] args) { int[] a = { 0, 5, 5, 0 }; int[] b = { 2, 5, 2, 2, 5, 0, }; int[] c = { 5, 0, 2, 0, 2, 5, 2 }; int index = 0; boolean 同じ手を出していない = true; while (同じ手を出していない) { if (a[index % a.length] == b[index % b.length] && b[index % b.length] == c[index % c.length]) { 同じ手を出していない = false; } else { index++; } } System.out.println((index + 1) + "回目で全員が同じ手を出しました"); } } 【実行結果】 50回目で全員が同じ手を出しました boolean 同じ手をだしていない = true と 同じ手を出していない = false の意味がわかりません; すいませんが回答お願いします。

  • java while文です。教えてください(__)

    public class mondai2{ //プログラム開始 public static void main(String args[]){ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int i; int ans=0; int seikai=0; for(i=0;i<5;i++){ try{ { Random ran = new Random(); int num1 = ran.nextInt(8)+1; int num2 = ran.nextInt(8)+1; ans = num1*num2; System.out.print("問題"+(i+1)+":"); System.out.print(num1 + "×" +num2 + "="); String s =in.readLine(); seikai = Integer.parseInt(s); if(seikai==ans){ System.out.println("正解"); }else{ System.out.println("不正解"); } } }catch(IOException e){ System.out.println("エラー"); } } } } このプログラムをwhile文か、do while文にして正解が出るまで問題が出続けるようにしたいんですけど、まったくわからなくて困っています>< 教えてください(+o+)

    • ベストアンサー
    • Java
  • while文の動作に関して

    以下のwhile文の動作結果に関して質問なのですが、 実行結果に「3」が表示される理由が理解できておりません。 numが「3」のときは「false」に該当するような気がするのですが。 ご教示頂ければ幸いです。   public class Asterisk {     public static void main(String args[]){       int num = 0;       while(num++ < 3) {         System.out.println(num);        }     }   }   実行結果   1 2 3

    • ベストアンサー
    • Java
  • switch文について

    独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。

    • ベストアンサー
    • Java
  • 文が指定されていませんエラーについて

    public class Stack2 { private static int[] stack = new int[50]; private static int ip = -1; //スタックポインター, -1ならデーターなし public static int push ( int inData ) { // データー格納 if (ip == (stack.length - 1)) { System.out.println(\"スタックがいっぱいです\"); } else { stack[++ip] = inData; } } public static int pop ( ) { // データー取り出し if ( ip < 0 ) { System.out.println (\"スタックにデーターがありません\"); return -2147483648; } else { return stack[ip]; } } } 「Stack2.java:10:return 文が指定されていません」コンバイルエラーになります。 どのようにデバックすれば良いのか教えてください。

  • java eclipse do-while文

    計算問題のプログラムです。No…0を選択したときにwhile文から抜け出したいです。 抜け出せない原因と解決方法(プログラム)を教えていただけるとありがたいです。 package lesson5; import java.util.Random; import java.util.Scanner; public class MentalArithmetic { static Scanner stdIn = new Scanner(System.in); static boolean confirmRetry(){ int cont; do{ System.out.print("もう一度?<Yes・・・1/No・・・0> : "); cont = stdIn.nextInt(); }while (cont != 0 && cont != 1); return cont ==1; } static void mondai1(){ Random rand = new Random(); do{ int p = rand.nextInt(900) + 100; int q = rand.nextInt(900) + 100; int r = rand.nextInt(900) + 100; while(true){ System.out.println(p + "+" + q + "+" + r + " = " ); int k = stdIn.nextInt(); // if(k == p + q + r) // break; System.out.println("違いますよ!!"); } }while (confirmRetry()); } public static void main(String[] args) { System.out.println("暗算力トレーニング!!"); while (true) { mondai1(); } } }

  • 数値を文字列に変換する?

    下のプログラムでなぜString ss= " "+dt;のように数値を文字列に変換しないとだめなんでしょうか? ちなみに桁数設定メソッドを作るプログラムです。 public class JcWidth { // JcWidth.java [java] public static void main(String args[]) { System.out.println(":" + toIntWidth(123, 8) + ":"); System.out.println(":" + toIntWidth(12345, 8) + ":"); System.out.println(":" + toIntWidth(-1234567890, 8) + ":"); System.out.println(":" + toHexWidth(4095, 8) + ":"); System.out.println(":" + toHexWidth(123456789, 8) + ":"); } // int値dtを先行空白付きw桁(最大12)の表現にする // 数値が指定幅より大きいときは必要な幅にする public static String toIntWidth(int dt, int w) { if (w > 12) w = 12; String ss = "" + dt; // 数値を文字列にする if (ss.length() > w) w = ss.length(); ss = " " + dt; return ss.substring(ss.length()-w); } // int値dtを先行0付きw桁(最大8)の16進数大文字表現にする public static String toHexWidth(int dt, int w) { if (w > 8) w = 8; String ss = Integer.toHexString(dt).toUpperCase(); if (ss.length() > w) w = ss.length(); ss = "0000000" + ss; return ss.substring(ss.length()-w); } } 

    • ベストアンサー
    • Java
  • (java)HTMLをParseさせず・・・

    初めてお世話になります。 現在、HTMLをParse(解析)せずに、 BufferedReder→indexOf(抜き取りたい「文字」の出現場所を検索)→ substring(indexOfの内容を元に「文字」を抜き取る) という内容のシステムをjavaで組みたい!と試行錯誤しております;; 目的はParseと上記内容での実行時間がどれくらい違うのかという興味で作成を開始しました。 今回、BufferedReader→indeOfまでは考え通り上手くいったのですが、 substiringで1000文字以上あるHTMLソースから指定した箇所(indexOf)で抜き取る作業ができないので教えてください。(正確には○○.substring(int,int)の○○部分をどこにしていしたらいいのかわかりません。) 是非ご教授の程よろしくお願いします。 実際のコードは下記の通りです。 import java.io.*; import java.net.URL; public class Test { public static void main (String []args){ add(); } public static void add(){ try { //URLを指定して読み込み URL u = new URL("http://'"URLを入力"'/"); InputStream is = u.openStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is,"EUC_JP")); String line ; int linenum=1; int length=1; //1行ずつ読み込み while ((line = br.readLine()) != null) { String A = "166"; String B = "102"; int i; int j; //文字列検索(HTMLソースの0~何文字目に出現!?) i = line.indexOf(A); j = line.indexOf(B); if(i>=0){ System.out.println((i+length) + "文字目"); } if(j>=0){ System.out.println((j+length) + "文字目"); } linenum++; length += line.length() + 1; String str1 = line; String str2 = str1.substring(i+length,j+length);                             //当然「line」なんかにsubstringかけても駄目でしたw System.out.println(str2) ; } is.close(); br.close(); } catch (FileNotFoundException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } 説明が意味不明な点もあるかと思いますので、 質問もお待ちしております。 是非、お力をお貸ししてください。 よろしくお願いいたします。

  • 書き換え

    以下のソースコード(*を使って二等辺三角形を表示するプログラム)をwhile文のかわりにdo-while文を使って書き換える方法が分かる方ぜひ教えてください。いろいろ試しましたがコンパイルできずに困っています↓ //Triangle2.java class Triangle2{ public static void main(String args[]){ try{ if(args.length !=1){ System.out.println("Please input single positive integer!"); } else if(Integer.parseInt(args[0])>0) { int n = Integer.parseInt(args[0]); int i=0; while(i < n){ int j=0; while (j <= i){ System.out.print("*"); j++; } System.out.println(); i++; } int m=n-1; while(m > 0){ int k=m; while(k > 0){ System.out.print("*"); k --; } System.out.println(); m --; } } else{ System.out.println("Please input single positive integer!"); } }catch(NumberFormatException e){ System.out.println("Please input single positive integer!"); } } }

  • エラーの訂正でアドバイスください。

    javaプログラミング超初心者です import java.io.*; public class ex22b { public static void main(String[] arg) { System.out.print("x: "); int x = (new Integer (in.readLine())). intValue(); System.out.print("y: "); int y = (new Integer (in.readLine())). intValue(); int a; while (y > 0) { a = a + x; System.out.println("kekka = " + a); System.out.println("y = " + y); y = y - 1; } System.out.println("乗算結果は " + a); } } というソースを書いたら、コンパイルの際に シンボルを見つけられません シンボル:変数 in 場所  :ex22bのクラス int x = (new Integer (in.readLine())). intValue();            ^ int y = (new Integer (in.readLine())). intValue();            ^ というエラーが出ました。 どこをどう直したらいいのでしょうか。

    • ベストアンサー
    • Java

専門家に質問してみよう