SubString错误indexoutofbounds Java

时间:2013-09-22 10:04:22

标签: java

我决定编写自己的subString方法,但是当我在测试驱动程序中测试它时,我的SubString方法中的一行代码收到错误。这是错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(Unknown Source)
at unisa.util.StringImproved.subString(StringImproved.java:618)

这是我的subString的代码:

    public String subString(int start, int end) {
    //empty string to append the new string's characters to
    String subString = "";
    //creating a new string to store content to allow function
    String s1 = new String(content);
    //read each character in the string and append based on the index
    for (int i=start; i<=end; i++){
        subString += s1.charAt(i);
    }
    //convert string back to a char array
    content = subString.toCharArray();
    return subString;

}

错误是拾取行subString + = s1.charAt(i);任何人都可以对我做错了什么有所了解?

PS。这不是一个无聊的任务,并且想要自己重新创建java函数。

提前致谢!!

我已根据要求添加了我的测试方法!!

private int testSubString(String testID) {
    int errorCount=0;



    header(testID);

    {
        System.out.println("Test[getting substring from middle] ");
        StringImproved str = new StringImproved("0123456789");
        String result = str.subString(1,2);
        errorCount+=handleResult(result,"1")?0:1;
    }

    {
        System.out.println("Test[getting first characters] ");
        StringImproved str = new StringImproved("0123456789");
        String result = str.subString(0,2);
        errorCount+=handleResult(result,"01")?0:1;
    }

    {
        System.out.println("Test[getting last characters] ");
        StringImproved str = new StringImproved("0123456789");
        String result = str.subString(str.length()-3,str.length());
        errorCount+=handleResult(result,"789")?0:1;
    }


    {
        System.out.println("Test[out of range] ");
        StringImproved str = new StringImproved("0123456789");
        String result = str.subString(0,str.length()+1);
        errorCount+=handleResult(result,null)?0:1;
    }

    {
        System.out.println("Test[zero length source] ");
        StringImproved str = new StringImproved("");
        String result = str.subString(0,str.length()-1);
        errorCount+=handleResult(result,null)?0:1;
    }
    return errorCount;      
}

2 个答案:

答案 0 :(得分:5)

数组从零开始

如果您的字符串长度为N,则索引从0N - 1N的总长度)。

您的for循环应为:

                   ↓‎
for (int i=start; i<end; i++) {

示例:

"This is a test"大小 14 T 位于 0 位置,最后 t 13 的地方。


正如@sanbhat所提到的,你需要检查一些案例,例如,content的大小小于end会发生什么?

答案 1 :(得分:2)

更改

for (int i = start; i <= end; i++){
   subString += s1.charAt(i);
}

for (int i = start; i < end; i++){
    subString += s1.charAt(i);
}

但这很容易出错,因为它取决于你如何调用自己的substring()方法。原因是参数可能超过字符串的长度(例如,为负数)。

更好的方法是对确保参数进行一些检查。

if (start >= 0 && end >= start) {
   end = Math.min(myString.length(), end);
} else { 
   throw new IllegalArgumentException("Invalid arguments");
}

和做循环。

您还应注意,String#chatAt(int i)方法返回表示String对象的从零开始的 char[]数组的字符。