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

Sen*_*rJD 1 java android

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

Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257");
Run Code Online (Sandbox Code Playgroud)

这并没有NumberFormatException像预期的那样抛出.结果是Infinity.使用其他UUID时会抛出异常.问题仅出在Android Java上,在桌面版上它可以正常工作.为什么?

PS:使用Android API 17,在Android 4.4.2手机上重复异常.

Sen*_*rJD 7

Double.parseDouble() 码:

if (result.e < -1024) {
    result.zero = true;
    return result;
} else if (result.e > 1024) {
    result.infinity = true;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Double有exponencial视图MeP,where M - mantissaP - exponent(MeP等于M*10^P).Android首先检查指数是否存在,如果存在,则> 1024确定它是否存在Infinity并停止任何其他验证.

在这段代码中,我们可以看到,如果在e字母之后是任何负数,小于1024,则该数字被识别为正确但等于zero.

Double.parseDouble("Any characterse1025"); //Infinity
Double.parseDouble("Any characterse-1025"); //0.0
Run Code Online (Sandbox Code Playgroud)

我们的案例UUID是:

Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257"); //Infinity
Double.parseDouble("4cff9d79-a696-4dfc-89fe-126534117257"); //0.0
Run Code Online (Sandbox Code Playgroud)

因此,使用此方法是不安全的.寻找替代方案.

UPD: 原始调查页面(ru).翻译不是为了一个速率.

UPD2: Bug 已经修复.