我运行的代码到目前为止一直运行良好,但遇到了一个奇怪的错误。出错的代码片段从输入字符串中获取“字段”并将其转换为long。
抛出异常时的输入字符串 - 这是从命令行复制的。我无法从文件中获取实际字符串,因为输入文件是144GB而我不是在寻找它!一切看起来都很正常。在文件中,元素应以制表符分隔。
SBL_XSMJR247_ID:2331788_ 99 mm17 35305666 70 89M =35305769 190 NNGTCTTGGAGATCACGAGGCCCATGACAGCATGGAACAAGTCATGTGAAGCCCAGCCAGACACGATGAAAAATTTATAGACAAAAAGA ~~JGIIJJ@CFGIJJJJIJJIJJJIEIGJJIJJJJJJJHIJIJIIFIIJJJHFHH?DFFCACEEDDDDDDDDBBDDDEEDDDDDDDD@B xl:i:35305666 xr:i:35305754 xs:i:89 xd:A:f xm:A:u xa:A:"" xL:i:35305666 xR:i:35305855 xS:i:190xW:i:14 xP:i:0 xQ:i:0 xC:A:"" xD:A:"" PG:Z:novoalign AS:i:12 UQ:i:12 NM:i:2 MD:Z:0G0C87 PQ:i:18 SM:i:70 AM:i:70
抛出的错误消息:
nfeerror: For input string: "35305666" xL
是的,它有点难看......
最后运行产生错误的代码。
/** Searches the input line and returns the last element of the field, i.e xL:i:20 returns 20.
* @param line line to search
* @param field fieldName
* @return long field value
*/
private long findValueLong(String line, String field) {
try {
String[] lineComps = line.split("\t");
for (String component : lineComps) {
if (component.startsWith(field)) {
return Long.parseLong(component.split(":")[component.split(":").length - 1]);
}
}
}catch(NumberFormatException nfe){
System.out.println("nfe error: " + nfe.getMessage() + " " + field);
System.out.println(line);
System.exit(0);
}
return 0L;
}
抛出的消息意味着代码正确地找到了xL字段的长部分 - > “35305666”但似乎无法解析结果。这个值远远大于长期的最大值,所以不可能。
有什么想法吗?
感谢。
更新1:
我添加了一些println语句并重新运行代码以查看正在解析的内容。我已添加:
System.out.println(component)
System.out.println(component.split...) // the bit after the second ':'
这两个语句返回的值是:
xL:i:35305666
35305666
我与文件交叉引用了值,并且没有隐藏的非打印字符。该值显示为...\txL:i:35305666\t...
我现在在函数的末尾添加了一个.trim(),它获取了要解析的最终值,并再次重新运行代码..让我们看看会发生什么!
更新2:
将.trim()
添加到正在解析的字符串的末尾似乎解决了这个问题。 split函数必须在字符串中的某处添加空格?这是非常奇怪的行为,但因为我运行了大约1.6亿条这些线路而且错误只发生过一次。这条线没有什么特别之处,它的生成方式与其余部分相同。 trim()
似乎更像是一种解决方法而非解决方案......