【问题标题】:java.lang.StringIndexOutOfBoundsException: String index out of range: (again) [duplicate]java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:(再次)[重复]
【发布时间】:2017-02-12 20:36:16
【问题描述】:

我已经阅读了许多类似的主题,但在我的无知中似乎无法弄清楚如何将答案应用到我的代码中。对不起...

运行下面的代码时出现错误: java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:

程序的结果是好的。我从使用扫描仪输入的字符串中获取所有大写字母。但是错误消息有点碍事。

非常感谢任何帮助!提前致谢!

import java.util.Scanner;

public class TestClass {

    public static void main(String[] args) {

        Scanner in3 = new Scanner(System.in);
        System.out.print("Enter a senctence with capitals: ");
        String inputString = in3.nextLine();

        int stringLength = String.valueOf(inputString).length();
        int i = 0;

        while (i <= stringLength)
        {
            int subsStart = i;
            int subsEind = i + 1;

            String stringToCheck = inputString.substring(subsStart, subsEind);

            char letterToCheck = stringToCheck.charAt(0);

            if (Character.isUpperCase(letterToCheck)) 
            {
                System.out.println(letterToCheck);
            }
            i++;

        }
        in3.close();

    }

}

【问题讨论】:

  • 当 i == stringLength 时会发生什么?子串是如何工作的?
  • 如果i == stringLength - 1会发生什么?
  • 那你为什么需要String.valueOf 已经是字符串的东西?
  • 你也应该看看for loop。在您的情况下,它比 while 更合适。
  • 感谢所有反馈的家伙。刚开始使用 Java,感谢您是 cmets,并将检查所有内容!

标签: java


【解决方案1】:

你有几个地方要索引字符串的末尾。首先,您的主循环不应该通过stringLength,因为字符串的长度是字符串的非法索引。循环最多应该经过stringLength - 1,也就是说循环应该写

while (i < stringLength) // NOT i <= stringLength

但是还有另一个问题。在循环内部,您正在计算

String stringToCheck = inputString.substring(subsStart, subsEind);

然后再评估

char letterToCheck = stringToCheck.charAt(0);

假设stringToCheck 不是空字符串。不幸的是,当subsStart == stringLength 时,这个假设失败了。因此,您需要在 之前 stringLength:

停止外循环
while (i < stringLength - 1)

但是,由于您一次只对一个字母感兴趣,所以我不会费心提取子字符串。此外,您的代码中有很多冗余变量。我会这样写:

public static void main(String[] args) {

    Scanner in3 = new Scanner(System.in);
    System.out.print("Enter a sentence with capitals: ");
    String inputString = in3.nextLine();

    int stringLength = inputString.length();

    for (int i = 0; i < stringLength; i++)
    {
        char letterToCheck = inputString.charAt(i);

        if (Character.isUpperCase(letterToCheck)) 
        {
            System.out.println(letterToCheck);
        }

    }
    // in3.close(); // not really needed for System.in
}

【讨论】:

    【解决方案2】:
    while (i <= stringLength)
    

    应该是

    while (i < stringLength)
    

    例如,hello 的字符串长度为 5,但在索引方面,它最多只能达到 4.. 0 1 2 3 4

    【讨论】:

    • 其实while (i &lt; stringLength - 1)
    【解决方案3】:

    最后两次迭代将失败。

    String stringToCheck = inputString.substring(subsStart, subsEind);
    

    尝试读取索引stringLength & stringLength+1,但只有stringLength-1

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 2016-02-25
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2019-05-22
      相关资源
      最近更新 更多