我有一个流操作(Java 8),用于将一堆字符串解析为双精度并求和。一些字符串是空的,但我不相信任何一个都为空。我添加了一个filter
操作,可以在空的对象到达Double.parseDouble()
可能导致错误的位置之前对其进行过滤,但是该过滤器似乎无法正常工作。
我的代码:
double myTotal= myObjectList.stream()
.map(myObject::getAmount)
.peek( s -> System.out.println("before filter: " + s) )
.filter( s -> !s.isEmpty() )
.peek( s -> System.out.println("after filter: " + s) )
.mapToDouble(Double::parseDouble)
.reduce(0D,Double::sum);
这是在JSP中,并且JSP无法编译。根据错误页面,异常发生在最后一行(.reduce(0D,Double::sum);
),但“根本原因”是“ java.lang.NumberFormatException: empty String
”- Double.parseDouble()
遇到空字符串。
我尝试了几种filter
操作排列,包括一些检查为null的检查和一些!s.equals("")
类似的检查。我添加了peek
调试操作,很明显在该行之前和之后都打印了一个空字符串filter
。
我究竟做错了什么?是否有更好的方法来过滤无法解析为双精度的值?
带有空格的字符串,技术上不为空,会导致消息“空字符串”引发异常。正如另一个提示指出的那样,解决方案是首先修剪输入字符串。
这种混淆是由不幸的文档错误导致的,该错误sun.misc.FloatingDecimal.readJavaFormatString
由间接调用Double.parseDouble
。虽然的语义String#empty
是
true
当且仅当length()
为0时返回。
执行readJavaFormatString
实际修剪输入字符串第一个,然后计算长度,并抛出NumberFormatException
与(非常误导)消息“空字符串”:
in = in.trim(); // don't fool around with white space.
// throws NullPointerException if null
int len = in.length();
if ( len == 0 ) {
throw new NumberFormatException("empty String");
}
通过执行以下操作可以很容易地观察到这一点:
Double.parseDouble(" ");
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句