看似有效的long上的parseLong NumberFormatException

时间:2018-03-07 08:14:05

标签: 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

抛出的错误消息:

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()似乎更像是一种解决方法而非解决方案......

0 个答案:

没有答案