最近在跑的一个spark任务总是因为parseDouble中报NumberFormatException,但是我的逻辑中都是基于fastsql中的类型断定去存放到一个Double集合中,当使用的时候会去进行进行Decimal的断定,在类型转换的时候就直接进行了转换,代码如下
private boolean isMatch(String value) {
int integerLocation = numericPrecision - numericScale;
long min = (long)(0 - Math.pow(10, integerLocation));
long max = (long)Math.pow(10, integerLocation) - 1;
double doubleValue = Double.parseDouble(value);
return min < doubleValue && doubleValue < max;
}
那么我将逻辑debug以后发现是因为其中有一个3,parse失败了,那么我粘贴出来case如下
String a="3";
String b="3";
System.out.println(Integer.valueOf(a));
System.out.println(Integer.valueOf(b));
Double.parseDouble(a);
Double.parseDouble(b);
我确认过了字符串前后并没有空格等其他字符,并且用Integer转换后也没问题,结果如下
3
3
Exception in thread "main" java.lang.NumberFormatException: For input string: "3"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at com.levin.type.DecimalType.main(DecimalType.java:89)
这里让我很是费解,下面debug跟到源码中发现原来是因为参数b中的内容并不是一个单纯的3,直接上代码
当chart以后发现ascii为65299,那么当赋值的时候导致char类型越界,才导致后面的失败