/* Method: findName() */
/**
* Finds the name of the entry and sets it to the name variable.
*/
private void findName(String line){
end = line.indexOf(" ");
name = line.substring(0,end);
}
/* Method: findDecades() */
/**
* Finds the name of the entry and sets it to the name variable.
*/
private void findDecades(String line){
for(int i = 0; i<NDECADES; i++){
int start = end + 1;
end = line.indexOf(" ",start);
String decadeTemp = line.substring(start, end);
data[i] = Integer.parseInt(decadeTemp);
}
}
Line如下所示:
Sam 58 69 99 131 168 236 278 380 467 408 466
当我运行代码时,第一个方法运行正常,但是当它到达该行时会抛出错误异常:
String decadeTemp = line.substring(start, end);
编辑:
抛出的错误是:
抛出新的StringIndexOutOfBoundsException(endIndex - beginIndex);
答案 0 :(得分:4)
我怀疑(没有进一步的信息)你在
期间运行了你的字符串的结尾line.substring(start, end);
所以你的边界条件不对。我会打印出开始/结束值并从中确定是什么问题。我强烈建议,顺便说一下,在这样的问题中你发布了你得到的异常/堆栈跟踪。
更进一步,通过使用String.split(" ")并在结果数组中进行迭代,您可以更轻松地找到上述内容。这往往不易出错,因为你可以在数组中使用for循环,而不必跟踪开始和结束点(我总是错误,它的价值)。
(因为这是作业,我假设输入字符串格式正确。否则你将不得不提供各种输入,并且需要更强大的解决方案)
答案 1 :(得分:4)
添加另一行
end = line.indexOf(" ",start);
System.out.println("Doing substring of "+start+" to "+end); // new line
String decadeTemp = line.substring(start, end);
这应该是显而易见的。 我猜测结尾是-1,这意味着你没有找到空格,NDECADES太大了。
答案 2 :(得分:1)
如果line
中没有空格怎么办?或者如果它上面没有start
的任何空格怎么办?
答案 3 :(得分:1)
您可能想看一下String上的其他一些方法,这些方法可以使这更简单(String.split()浮现在脑海中)。
答案 4 :(得分:0)
问题解决NDECADES是一个太大的空间。
答案 5 :(得分:0)
要自己开始发现问题,你应该看看String#indexOf
和String#substring
的Javadoc,特别是关于边界情况会发生什么(比如找不到任何东西等)。
答案 6 :(得分:0)
你需要做一些检查,例如
if (start > 0 && end > 0 && end < length).
您还需要检查decadeTemp
是否为数字。