我有一个多行文本输入文件:如果存在字符串“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
因此我不知道为什么我会得到负值。任何人都可以看到我遗失的东西或者我需要检查的东西,我没有提到过吗?
答案 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.0
和double
float
这样的事情
答案 1 :(得分:2)
if((inputLine.indexOf("Log Number:"))>-1) {
logNumRecStart = inputLine.indexOf("Log Number:")+12;}
else
logNumRecStart = 0;
logNumRecEnd = inputLine.indexOf("Log Date:");
...
这一切都是正确的,并且正在为您提供正确的值,因此您的错误必须位于您遗漏的地方。