Integer.valueOf转换负数时抛出NumberFormatException
来源:互联网 发布:java script else 编辑:程序博客网 时间:2024/06/05 20:44
1. 问题描述
今天在牛客上,有牛友抛出了这样一个问题:
Integer m =Integer.valueOf("11111111111111111111111100000000",2);
上面这段代码,二进制数的长度是32位,没超出Integer的范围,为什么会抛出NumberFormatException
的异常呢?
2. 探究
当时我也很好奇,所以就打开IDE,探究了一下源码,以下是过程:
下面,先看一下parseInt的注释:
注释中说,是通过查看第0个字符是否为’-‘来判定负数,而不是看最高位是否为1。如此一来好像解释的通了。再看一下真正的转换过程(这里我调了一下源码的排版,不然惨不忍睹…):
确实如注释中所说,此时,一个32位且最高位为1的二进制数,会被错误的判定为正数。而在下面有这样一行代码:
可以看到,一个32位且最高位为1的二进制数,会被累加32次,所以其累加和是超过Integer
正数的范围的。实际上不用等到第二个红框位置,在if(result<multmin)
时,就已经抛出异常了。multmin
我觉得为了防止result*radix
后溢出而设置的。代码的运行结果也印证了这个推测:
另外,result每次是加上负的digit,这是因为Integer的表示范围是-2的32次方到2的32次方-1.正数的值要小,那么在计算一个负数时,如果遵循先正向累加再求负的过程,是有可能溢出的。最终的结果输出可以很明显的看到是result是负数:
0 0
- Integer.valueOf转换负数时抛出NumberFormatException
- 备忘:Integer.valueOf抛出NumberFormatException
- SimpleDateFormat的parse方法转换抛出NumberFormatException异常
- Integer.valueOf()
- Integer valueOf
- Integer valueOf
- Integer.valueOf()
- Integer.valueof() Integer.parseInt()
- Integer.valueof() Integer.parseInt()
- Integer.valueof Integer.parseOf
- 字符串数字转换成整型(不用Integer.valueOf()方法)
- 字符串数字转换成整型(不用Integer.valueOf()方法)
- NumberUtils.toInt和Integer.valueOf两种转换的区别
- Integer.parseInt() 与 Integer.valueOf()
- java Integer.valueOf()方法
- java Integer.valueOf()方法
- java Integer.valueOf()方法
- java Integer.valueOf()方法
- XUtils3.0学习笔记(一)
- Windows中使用TortoiseGit提交项目到GitLab配置
- 数据库锁表情况
- 查看代码快速方法,notepad++,pycharm!
- Unity UGUI 原理篇 (一):Canvas 渲染模式
- Integer.valueOf转换负数时抛出NumberFormatException
- Navicat for Oracle 怎么进行调试
- 物理机ping不通虚拟机,虚拟机能上网,能ping通物理机
- 项目2 -程序的多文件组织
- 详解内部类
- 【Android】Android Studio 2上利用NDK进行OpenCV 3.1开发(注意点)
- MTK平台camera菜单项,相互限制修改
- tableview,collectionview上边有白边——的解决办法(iOS调试)
- C++拷贝构造函数 参数类型为什么是引用类型 ...