为什么我的字符串索引有时会超出界限?

时间:2014-02-27 02:06:07

标签: java string exception boundary

Class Lab9

        ScalesSolution s = new ScalesSolution("00100");
        s.println();
        s.SmallChange();
        s.println();

ScalesSolution类中的方法SmallChange

public void SmallChange() {

    int n = scasol.length();
    System.out.println("The length of scasol is "+ n);
    //CS2004 method generates a random integer number between 0 and n
    int p = CS2004.UI(0,n);

    StringBuilder sb = new StringBuilder(scasol);
    if (scasol.charAt(p) == '0') {
        sb.setCharAt(p, '1');
    } else {
        sb.setCharAt(p, '0');
    }
    scasol = sb.toString();
}

多次运行代码后,我有时会收到错误

"String index out of range 5"

即使打印出来

  The length of scasol is 5

每次运行

错误:     00100     scasol的长度是5     线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:5         at java.lang.String.charAt(String.java:658)         在ScalesSolution.SmallChange(ScalesSolution.java:15)//指向if(scasol.charAt(p)=='0')         在Lab9.main(Lab9.java:9)

我不明白它有时会超出范围。有什么帮助吗?

2 个答案:

答案 0 :(得分:5)

索引的数字从0开始,所以如果下面的代码生成0到5之间的数字,它将不适用于有5个字符的字符串(只有索引0到4才有效)。

//CS2004 method generates a random integer number between 0 and n
int p = CS2004.UI(0,n);

将其更改为

int p = CS2004.UI(0,n-1);

答案 1 :(得分:2)

字符串以数组索引0开头。长度为5的字符串的索引为0,1,2,3,4。从第5个索引读取scasol.charAt(p) == '0',您正在读取字符串的一部分那是出界的。

要解决此问题,只需将索引值1降低:scasol.charAt(p-1) == '0'