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 code: character- 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 回答