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

3
我有一个多行文本输入文件:如果字符串“日志编号:”存在,则紧随其后的是日志编号。如果字符串“日志编号:”不存在,则该记录中没有日志编号。始终存在字符串“日志日期:”。如果存在“日志编号:”,则它会跟随在其后,如果不存在,则会出现在文件中的那个位置。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);
...

当我输出起始和结束索引时,这里是一个示例。
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包括“日志编号:”,但索引被设置为负数,导致我要提取的子字符串出现越界异常。通过目测文件,可以确定测试值是否存在于相应行中。在所有情况下,我的logNumRecEnd值都是正确的。

通过计算源文件中inputLine的字符数,我已验证如果logNumRecStart的负数值变为正数,则将得到正确的数字。

我没有使用lastIndexOf,所以我不知道为什么会得到负值。有人看到我遗漏了什么或需要检查我未提及的内容吗?


2
你能给我们更多细节吗?比如打印输出的代码部分? - AntonioJunior
@PeterLawrey: 字符串索引超出范围:-389 - dwwilson66
@AntonioJunior: System.out.println(recNum+">>> "+logNumRecStart+" to "+logNumRecEnd); 如果我将我的 logNumber 字段添加到打印语句中,就会出现越界异常。 - dwwilson66
@dwwilson66,请看我的编辑,关于如何修改代码有一个建议。 - Peter Lawrey
我让供应商重新运行数据提取,并明确要求他们仅包括可打印的ASCII字符。一切都像梦一样顺利运行。 - dwwilson66
显示剩余3条评论
2个回答

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 to 357

我猜您在数字前面打印了符号“-”,因为对于 int 类型没有 -0(顺便说一下:您说这是 0)。

52>>> -371 to 390

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

顺便说一下:对于 doublefloat 类型,有负零 -0.0 的概念。


1
那么,索引越界异常是从哪里来的? - bchurchill

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

这些都是正确的,并且可以给你正确的值,因此你的错误一定是在某个地方遗漏了...。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接