0

我决定编写自己的 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)

这是我的子字符串的代码:

    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;      
}
4

2 回答 2

5

数组是从零开始的

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

你的for循环应该是:

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

例子:

"This is a test"大小为14T0位,最后一个t13位。


正如@sanbhat 提到的,您需要检查一些情况,例如,大小content小于会发生什么end

于 2013-09-22T10:05:43.790 回答
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[]

于 2013-09-22T10:05:30.077 回答