2
|
Dhiresh Budhiraja · 技术社区 · 6 年前 |
1
4
简短回答:
你的stacktrace告诉你哪里可以找到哪里出了问题。你的Integer.valueOf()方法调用Integer.parseInt(),这又在第583行抛出NumberFormatException。您可以在 openjdk .
我已经删除了代码中当前示例没有运行的部分。请注意,限制为-2147483647(超过最小值的一个)!同样,multmin is-1073741823。在循环的第一次迭代中,result是0,所以result*基数是0,digit是1(这是字符串中的第一个数字),所以result-digit是-1。在第二次迭代中,数字变成0,但现在结果*基数是-2。在第三次迭代中,我们得到-4,然后是-8,等等。。。这个过程一直持续到结果等于-1073741824,这比我们的极限值少了一个。 现在,我们还可以看到该方法检查是否在数字中添加了符号(+或-)。有趣的是,如果我们加上一个负数,我们会看到这个极限被设置为minu值。因此,与直觉相反,我们可以简单地通过添加减号来“修复”代码:
另一方面,你做了一些奇怪的铸造。而不是:
你应该能够写:
我说“应该”,因为实际上你不能。这将导致另一个例外!这是因为Byte.valueOf()方法简单调用Integer.valueOf()方法,然后将答案强制转换为一个字节!因为一个整数的10000000是000…00010000000=128,它会告诉你对于一个字节来说太大了。 哇!那你那奇怪的施法技巧为什么管用呢?因为一种叫做“无声溢出”的东西。Java意识到您非常希望将数字128放入一个字节中,这是不可能的,因此它将尽可能多的数字放入其中(127),并通过将剩余的1加起来,将数字压缩到底部,剩下的是-128。我想这就是silent overflow的设计目的,但是依赖它肯定是个坏主意。为了说明在你的队伍中发生了什么:
所以,不要对有符号的数字使用parseInt()或valueOf()。 |