1

なぜこのエラーが発生するのか、よくわかりません。このコードは、句読点を無視して回文をテストするためのものです。

だからここに私のコードがあります:

            char junk;
            String temp = "";

            for (int i = 0; i < txt.length(); i++)
            {
                junk  = txt.charAt(i);
                if (Character.isLetterOrDigit(txt.charAt(jumk)))
                {
                    temp += junk;
                }
            }
            txt = temp;
            left = 0;
            right = txt.length() -1;

            while (txt.charAt(left) == txt.charAt(right) && right > left)
            {
                left++;
                right--;
            }

java.lang.StringIndexOutOfBoundException :
PalindromeTester.main(PalindromeTester.java:35)の文字列インデックスが範囲 0 を超えています

35行目は次のとおりです。

    while (txt.charAt(left) == txt.charAt(right) && right > left)
4

2 に答える 2

1
 if (Character.isLetterOrDigit(txt.charAt(yP)))

あなたの問題です、yPは位置への参照ではなく文字です。

あなたがおそらく意味していたのは:

 if (Character.isLetterOrDigit(yP))

編集:私のコメント:右の値は-1で、charAtには0より大きい整数が必要です..したがって、txtの長さを確認し、== 0の場合は、実際の単語が必要であるというメッセージを表示する必要があります.

この行に到達する前に、実行を停止する必要があります。

right = txt.length() -1;

これはあなたの固定コードです:

do
    {
        System.out.println("Enter a word, phrase, or sentence (blank line to stop):");
        txt = kb.nextLine();
    }

while (!txt.equals(""));

    txt = txt.toLowerCase();
    char yP;
    String noP = "";

    for (int i = 0; i < txt.length(); i++)
    {
        yP  = txt.charAt(i);
        if (Character.isLetterOrDigit(txt.charAt(yP)))
        {
            noP += yP;
        }
    }
    txt = noP;

    left = 0;
    right = txt.length() -1;

    while (txt.charAt(left) == txt.charAt(right) && right > left)
    {
        left++;
        right--;
    }

    if (left > right)
    {
        System.out.println("Palindrome");
        cntr++;
    }
    else
    {
        System.out.println("Not a palindrome");
    }
于 2012-10-28T22:39:21.873 に答える
0

変数は、インデックスyPではなく indexの文字です(エラーが発生した行で使用しているため)。その行を次のように変更します。 i

if (Character.isLetterOrDigit(yP)) { ...

新しい問題の編集:

この場合、何かを繰り返し実行したくないため(これがループの目的です)、ユーザーが何も入力していないかどうかを確認するために while ループは必要ありません。何かを1 回だけ実行したい場合、つまり、見つかった回文の数を出力したい場合は、ifステートメントを使用できます。構造は次のようになります。

do {
    get user input

    if they entered the empty string "" {

        print out how many palindromes they have found so far

    } else { // they must have entered text, so check for palindrome

        your normal palindrome checking code goes here

    }

} while (your condition);

編集2:

変更してみる

if (left > right)

if (left >= right)

left==right の場合、両方とも奇数長の文字列 (カヤックの 'y' など) の中央文字にあることを意味するため、文字列が回文であることを意味します。

于 2012-10-28T22:40:02.620 に答える