short:短数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)
为什么如下
System.out.println(Short.parseShort("1111111111111111", 2));
返回
java.lang.NumberFormatException: Value out of range.
如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:
- 第一个参数为null或者是长度为零的字符串。
- 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
- 字符串的任何字符都不是指定基数的数字,除了第一个字符可以是减号' - '('\ u002D')或加号'+'('\ u002B'),前提是字符串是长度超过1。
- 字符串表示的值不是short类型的值。
我假设错误来自最后一个子弹,但我认为使用Short时16'1'位相当于-1。那么,它应该有效吗?
你引用的javadoc声明Short.parseShort
将数字解析为带符号的数字。
1111111111111111
(16个1
数字)作为带符号的数字读取意味着216-1或65535.这太大而不能表示为short
。
备择方案:
parseShort
解析无符号值,那将是有效的。 (但没有...)Integer.parseInt
,对int
结果进行范围检查,然后将其投射到short
。我认为当使用Short时,16'1'位相当于-1。那么,它应该有效吗?
很不幸的是,不行。 parseInt
方法解析带符号的值。
思考实验:如果用户输入1111111111111111
的意图是它真正意味着一个正号码,那该怎么办?即+65535?如何将您的想法与解析方法视为已签名和无符号可互换?
1111111111111111
应转换为65535
,大于short
可以表示的最大值(32,767)。尝试一些较小的数字。