当我认为它应该是NumberFormatException时,Double.parseDouble()返回Infinity

时间:2014-08-22 08:36:08

标签: java android

Double.parseDouble()方法存在奇怪且意外的行为:

Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257");

没有像预期的那样抛出NumberFormatException。结果是Infinity。与其他UUID相比,抛出了异常。问题仅出在Android Java上,在桌面版上它可以正常工作。为什么呢?

PS:二手Android API 17,Android 4.4.2手机上的异常重复。

1 个答案:

答案 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 - mantissaP - exponentMeP等于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