我决定编写自己的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;
}
答案 0 :(得分:5)
数组从零开始。
如果您的字符串长度为N
,则索引从0
到N - 1
(N
的总长度)。
您的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[]
数组的字符。