2

私は私のプログラムで次の問題に遭遇しました(それを実行しようとしたときにのみ、正常にビルドされます):

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 57
at java.lang.String.substring(String.java:1907)
at Question7.main(Question7.java:68)

サイトにも同様の質問があることは知っていますが、頭の中で手順を実行しているので、これがどこで間違っているのかわかりません。尋ねられたコード/質問のコンテキストはそれほど重要ではないと思います。この問題は次の行と関係があると思います。

else if (s1.substring(i,i+1).matches("[0-9]"))

if (counthyphen == 3 && countdigits == 9 && (s1.substring(i, i+1).matches("[0-9]") || s1.substring(i, i+1).matches("X")))

しかし、どうぞ、あなた自身を見てください。助けていただければ幸いです!

public class Question7
{
public static void main(String args[])
{
    //Declare and initialize.
    String s1 = new String("0-471-34609-8");
    int counthyphen = 0, countdigits = 0;

    //Begin "for" loop.
    for (int i = 0; i < s1.length()-1; i++)
    {
        /////////////////////////////////
        // Check for missing hyphens //
        if (s1.charAt(1) != '-')
        {
            i = s1.length();
        }
        else if (s1.charAt(11) != '-')
        {
            i = s1.length();
        }

        // Now add to the count values //
        if (s1.charAt(i) == '-')
        {
            counthyphen++;
        }
        **else if (s1.substring(i,i+1).matches("[0-9]"))**
        {
            countdigits++;
        }
        /////////////////////////////////
    }

    int i = s1.charAt(s1.length()-1);
    //Check if it's an ISBN and print result.
    **if (counthyphen == 3 && countdigits == 9 && (s1.substring(i, i+1).matches("[0-9]") || s1.substring(i, i+1).matches("X")))**
    {
        System.out.print("This number is an ISBN.");
    }
    else
    {
        System.out.print("This number is NOT an ISBN.");
    }
}
}
4

2 に答える 2

3
int i = s1.charAt(s1.length()-1);

このコードは、ASCII codecharacterをインデックス:-s1.length() - 1に格納します。これは、アクセス可能な文字列インデックスcertainlyよりも大きくなる可能性があります。maximum

たとえばlast現在の文字列の文字は8、です。これASCII codeは次のとおりです56。-、これは間違いなく失敗します。

したがって、s1.substring(i, i+1)その後のif条件では失敗します。

実際、私はその行の必要性をまったく理解していません。なんで使ってるの?


また、あなたのif-elseブロックはbuggy私には思えます:-

    if (s1.charAt(1) != '-')
    {
        i = s1.length();
    }
    else if (s1.charAt(11) != '-')
    {
        i = s1.length();
    }

なぜiそこの両方のブロックに同じ値を割り当てたのですか?

あなたはこのようなものが欲しかったのかもしれません:-

    if (s1.charAt(1) != '-' || s1.charAt(11) != '-')
    {
        break;  // Just break if not a valid string
    }
于 2012-11-20T21:36:35.660 に答える
0

ゼロインデックスでforループを開始しています。

for(int i = 0; i <s1.length()-1; i ++)

しかし、次のコードでは、部分文字列がiを超えています。

.substring(i、i + 1)。

最適化ノートでは、正規表現を使用して、インデックス1と11のハイフンをチェックできます。

于 2012-11-20T21:42:11.877 に答える