方法存在极端且意外的行为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手机上重复异常.
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 - mantissa和P - 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 已经修复.
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |