看似有效的long上的parseLong NumberFormatException

Sam*_*Sam 5 java numberformatexception

我运行的代码到目前为止一直运行良好,但遇到了一个奇怪的错误.出错的代码片段从输入字符串中获取"字段"并将其转换为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
Run Code Online (Sandbox Code Playgroud)

抛出的错误消息:

nfeerror: For input string: "35305666" xL
Run Code Online (Sandbox Code Playgroud)

是的它有点难看..

最后运行的代码产生错误.

 /** 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;
}
Run Code Online (Sandbox Code Playgroud)

抛出的消息意味着代码正确地找到了xL字段的长部分 - >"35305666",但它似乎无法解析结果.这个值远远大于长期的最大值,所以不可能.

有任何想法吗?

谢谢.

更新1:

我添加了一些println语句并重新运行代码以查看正在解析的内容.我已添加:

 System.out.println(component)
 System.out.println(component.split...) // the bit after the second ':'
Run Code Online (Sandbox Code Playgroud)

为两个语句返回的值是:

xL:i:35305666
35305666
Run Code Online (Sandbox Code Playgroud)

我已经使用文件交叉引用了值,并且没有隐藏的非打印字符.这个值出现了,因为...\txL:i:35305666\t...我现在在函数的末尾添加了一个.trim(),它获得了解析的最终值,并且再次重新运行代码.让我们看看会发生什么!

更新2:

添加.trim()到正在解析的字符串的末尾似乎已经解决了这个问题.split函数必须在字符串中的某处添加空格?这是非常奇怪的行为,但因为我运行了大约1.6亿条这些线路而且错误只发生过一次.这条线没有什么特别之处,它的生成方式与其余部分相同.trim()似乎更像是一种解决方法而不是一种解决方案......