我需要以十六进制格式读取32位数字。当输入负值时,将出现输入不匹配异常。只要数字为正数(00000000〜7FFFFFFF),一切都会起作用,但是任何负数(80000000〜FFFFFFFF)都会失败。
System.out.println("Enter first number in hexadecimal format: ");
Scanner readX = new Scanner(System.in);
int a = readX.nextInt(16);
我尝试了各种格式(FFFFFFFF,0xFFFFFFFF,-FFFFFFFF,-7FFFFFFFF,〜FFFFFFFF),结果相同。
有任何想法吗?我觉得我一定很想念一些明显的东西,但是我完全被困住了!
最佳答案
由于2147483648
失败的原因相同(Integer.MAX_VALUE
多一个),导致Integer.parseInt
失败:该值太大。它不会将ffffffff
或80000000
解释为负数,而是大的正数。这些数字太大了,无法解释为int
。Scanner.nextInt(int radix)
匹配正则表达式以查看它是否可能是int
,然后将其传递给Integer.parseInt
进行解析:
如果下一个标记与上面定义的Integer正则表达式匹配,则将该标记转换为int值,就像通过删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀,然后通过Character.digit将非ASCII数字映射为ASCII数字一样。 ,如果存在特定于语言环境的负前缀和后缀,则在其前加上一个负号(-),然后将结果字符串以指定的基数传递给Integer.parseInt。
如果Integer.parseInt
无法表示为NumberFormatException
,则会抛出int
:
如果发生以下任一情况,将引发NumberFormatException类型的异常:
第一个参数为null或长度为零的字符串。
基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
字符串的任何字符都不是指定基数的数字,除非第一个字符可以是减号'-'('\ u002D')或加号'+'('\ u002B')(前提是该字符串是长于长度1。
字符串表示的值不是int类型的值。
您必须指定数字为负数。尝试-1
或-80000000
或两者之间的任何内容;他们会工作。
关于java - Java扫描仪nextInt(16)不接受负十六进制值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20127477/