【问题标题】:StringIndexOutOfBoundsException in while loop循环中的 StringIndexOutOfBoundsException
【发布时间】:2012-08-04 12:57:02
【问题描述】:

我有这个代码:

String input = JOptionPane.showInputDialog("Enter text");
StringBuilder forward = new StringBuilder("");
StringBuilder backward = new StringBuilder("");
int f = 0;
int b = input.length();


while(f < input.length()) {

    while(input.charAt(f) > 63) {

        forward.append(input.charAt(f));
        f++;

    }

    f++;
} 

System.out.println(forward);

虽然程序没有完成,但是这里已经抛出异常了。它说:

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:5(范围取决于我输入的字符数) 在 java.lang.String.charAt(Unknown Source)

奇怪的是,我昨天编写了类似的代码,并且运行良好,而且实用性相同。

我已经搜索了堆栈论坛和文档 oracle,但我只发现当索引等于字符串的大小时抛出此异常(对于 charAt 方法)。

所以它似乎仍然是这里的问题,但我找不到它。

while(input.charAt(f) > 63)

编辑:

为什么该代码不起作用?再次抛出与上述相同的异常?

while(b > 0) {

        if(input.charAt(b) > 63) {

            backward.append(input.charAt(b));

        }

        b--;
    }

【问题讨论】:

    标签: java while-loop


    【解决方案1】:

    这里f的值可以超过字符串的长度:

    while (input.charAt(f) > 63) {
        forward.append(input.charAt(f));
    
        // This next line might increase f past the end of the string.
        f++;
    }
    

    试试这个:

    while (f < input.length()) {
    
        char c = input.charAt(f);
        if (c > 63) {
            forward.append(c);
        }
    
        f++;
    } 
    

    第二个版本总是在尝试访问input.charAt(f)之前检查f &lt; input.length()

    【讨论】:

    • 谢谢。您的代码有效!但我仍然不知道为什么我昨天写的代码有效。它也有 2 个 while 循环。 (它还循环遍历某些单词中的字符。虽然循环实际上是一样的)。
    • @FirefoxxPwnass:您的代码在某些但不是所有情况下都可以工作。可能是昨天,您“走运”了,并且仅在有效的情况下对其进行了测试。
    • 看来编程是相对的事情;D再次感谢您的回答。我今天学到了一些东西;D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多