为什么Java的`indexOf`返回除(-1)以外的负数

时间:2012-07-25 13:22:33

标签: java indexof

我有一个多行文本输入文件:如果存在字符串“Log Number:”,则紧跟一个日志编号。如果字符串“Log Number:”不存在,则该记录中没有日志编号。总是有字符串“Log Date:”。它遵循“Log Number:”(如果存在)并显示在文件中的该位置(如果不存在)。

我的inputLine来自BufferedReader,它逐行读取我的文件。

...
if((inputLine.indexOf("Log Number:"))>-1) {
  logNumRecStart = inputLine.indexOf("Log Number:")+12;}
else
  logNumRecStart = 0;
logNumRecEnd = inputLine.indexOf("Log Date:");
...
logNumber = inputLine.substring(logNumRecStart,logNumRecEnd);
...

当我输出Start和End indeces时,这是我得到的样本。

49>>>  -0 to 357
50>>>  -0 to 361
51>>>  -0 to 384
52>>>  -371 to 390
53>>>  -315 to 334
54>>>  -325 to 352

记录49-51是“日志编号:”没有出现在输入行中的情况,正如预期的那样,logNumRecStart设置为0.记录52 - 54 包括“Log Number:”,但索引被设置为负数,导致我的子字符串出现越界异常。目视检查文件证明了在适当的行中存在(或不存在)测试值。在所有情况下,我的logNumRecEnd值都是正确的。

通过计算inputLine源文件中的字符数,我已经确认如果logNumRecStart的负值为正值,那么它就是正确的数字。

我没有使用lastIndexOf因此我不知道为什么我会得到负值。任何人都可以看到我遗失的东西或者我需要检查的东西,我没有提到过吗?

2 个答案:

答案 0 :(得分:8)

我会将代码更改为以下内容,以确保您没有错误。

final int logNumberPos = inputLine.indexOf("Log Number:");
final int logNumRecStart = logNumberPos > -1) ? logNumberPos + 12 : 0;
final int logNumRecEnd = inputLine.indexOf("Log Date:", logNumRecStart);

if (logNumRecEnd > 0)
    logNumber = inputLine.substring(logNumRecStart, logNumRecEnd);

  

49>>> -0到357

我怀疑您在号码前打印-,因为-0没有int(顺便说一下:你说这是0

  

52>>> -371至390

这应该是371 to 390,这更有意义。

BTW:-0.0double

float这样的事情

答案 1 :(得分:2)

if((inputLine.indexOf("Log Number:"))>-1) {
  logNumRecStart = inputLine.indexOf("Log Number:")+12;}
else
  logNumRecStart = 0;
logNumRecEnd = inputLine.indexOf("Log Date:");
...

这一切都是正确的,并且正在为您提供正确的值,因此您的错误必须位于您遗漏的地方。