Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子字符串错误indexoutofbounds Java_Java - Fatal编程技术网

子字符串错误indexoutofbounds Java

子字符串错误indexoutofbounds Java,java,Java,我已经决定编写自己的子字符串方法,但是当我在测试驱动程序中测试它时,我在子字符串方法中的一行收到一个错误。这就是错误: 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(StringImp

我已经决定编写自己的子字符串方法,但是当我在测试驱动程序中测试它时,我在子字符串方法中的一行收到一个错误。这就是错误:

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;

}
改变

然后他们做循环

您还应该注意,StringchatAtint i方法返回表示字符串对象的零基char[]数组的字符。

数组是零基的

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

您的for循环应该是:

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

这是一个尺寸为14的测试,T位于0位,最后一个T位于13位


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

这将不起作用。。如果内容长度小于结尾怎么办?@sanbhat这是为了说明为什么会发生异常,OP需要进行适当的gaurd检查。我们无法涵盖所有内容:至少我们可以警告OP?仅上述解决方案无法解决IndexAutofBound问题。不是吗@桑巴:是的,Thumsup santosh:我对for循环进行了更改,但它仍然返回一个错误:线程主java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:10位于java.lang.String.charAtUnknown源unisa.util.testing.TestDriverPublic.testStringImprovedTestDriverPublic.java:108位于特定的for循环。如何调用方法?我不一定调用它们,但如果有意义的话,我会用不同的字符串对方法进行测试。错误是实际行为和预期行为之间的差异。告诉我们预期的行为是什么。偶尔抛出StringIndexOutOfBoundsException是有充分理由的。还可以告诉我们您正在测试该方法的值。预期的行为@Oswald基本上是使该方法具有足够的功能,无论我在测试驱动程序中输入了什么字符串,它都应该创建该字符串的子字符串。如果它不能以自然方式计算该子字符串,该怎么办,例如,因为start大于输入字符串的长度,或者end大于输入字符串的长度,或者start大于end,或者start或end为负值?在这些情况下,您至少必须考虑您的方法应该做些什么。你可以不指定它;但是,对于上述输入值,抛出StringIndexOutOfBoundsException是可以接受的行为。我不知道你用哪个值测试了你的方法,所以我不知道为什么抛出StringIndexOutOfBoundsException是错误的。如果有帮助的话,我已经在我的原始帖子中添加了我的测试方法@奥斯瓦尔德听从马龙的建议。完成此操作后,还必须扩展方法,以便它检查开始参数和结束参数以及输入字符串的长度,以便在超出范围的情况下获得预期结果,在这些情况下返回空字符串的情况下获得零长度源,但根据正在进行的测试,预期为null。
for (int i = start; i <= end; i++){
   subString += s1.charAt(i);
}
for (int i = start; i < end; i++){
    subString += s1.charAt(i);
}
if (start >= 0 && end >= start) {
   end = Math.min(myString.length(), end);
} else { 
   throw new IllegalArgumentException("Invalid arguments");
}
                   ↓‎
for (int i=start; i<end; i++) {