Double.parseDouble()
方法存在奇怪且意外的行为:
Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257");
没有像预期的那样抛出NumberFormatException
。结果是Infinity
。与其他UUID相比,抛出了异常。问题仅出在Android Java上,在桌面版上它可以正常工作。为什么呢?
PS:二手Android API 17,Android 4.4.2手机上的异常重复。
答案 0 :(得分:7)
Double.parseDouble()
代码:
if (result.e < -1024) {
result.zero = true;
return result;
} else if (result.e > 1024) {
result.infinity = true;
return result;
}
Double具有exponencial视图MeP
,其中M - mantissa
和P - exponent
(MeP
等于M*10^P
)。 Android首先检查指数是否存在,如果是> 1024
,则确定它是Infinity
并停止任何其他验证。
在此代码中,我们可以看到,如果e
字母后面的任何负数少于1024
,则此数字会被识别为正确但等于zero
。< / p>
Double.parseDouble("Any characterse1025"); //Infinity
Double.parseDouble("Any characterse-1025"); //0.0
我们的案例是UUID
s:
Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257"); //Infinity
Double.parseDouble("4cff9d79-a696-4dfc-89fe-126534117257"); //0.0
因此,使用此方法是不安全的。寻找替代方案。
UPD: Original investigation page (ru)。翻译不是为了费率。
UPD2:错误是already fixed。