0

だから私はすべての母音を$に置き換えて単語を印刷するプログラムを書き込もうとしています。Javaで。

実行するとこのエラーが発生し続けますがexception in thread main java.lang.StringIndexOutOfBoundsException: String index out of range: 6、正常にコンパイルされます。これがコードです。

import java.util.*;

public class SummerFour
{
    public static void main(String[] args)
    {
        Scanner keyboard = new Scanner(System.in);

        int cnt = 0;
        String word;
        String output = "";
        char letter = 'x';
        System.out.print("enter word to test: ");
        word = keyboard.nextLine();

        do {

            cnt++;
            letter = word.charAt(cnt - 1);

            if (letter == 'a' || letter == 'i' || letter == 'e' || letter == 'u' || letter == 'o')
            {
                letter = '$';
            }
        }
        while (cnt <= word.length());

        System.out.println(word);
    }
}
4

1 に答える 1

1

do...whileループにoff-by-oneエラーがあります。cnt文字列のサイズ以下であるかどうかを確認してから、文字列を1つインクリメントし、その値-1を取得してのインデックスとして使用しString.charAt()ます。文字列は0からインデックス付けされるため、これは問題があります。したがって、文字列の最後では、常に1つ行き過ぎてしまいます。

この例について考えてみましょう。

tacos

これは5文字の単語です。の場合cnt = 5、もう一度ループに戻り(5は5以下であるため)、6にインクリメントします。次に、値5(6 -1)でcnt呼び出しますが、範囲は0のみです。 -4(0 = t、1 = a、2 = c、3 = o、4 = s)、したがって5は範囲外です。次のような操作を行うことで、do ... whileループを適切に機能させ、混乱を少なくすることができます。String.charAt()tacos

    do
    {
        letter = word.charAt(cnt);

        if (letter=='a'||letter=='i'||letter=='e'||letter=='u'||letter=='o')
        {
            letter='$';
        }
        cnt++;
    } while(cnt<word.length());

もちろん、コードはまだあなたが望むことをしませんが、あなたはもはや元のエラーを受け取りません。宿題のようですので、これからも続けていきます。

于 2012-07-29T03:13:45.213 に答える