我需要以十六进制格式读取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失败:该值太大。它不会将ffffffff80000000解释为负数,而是大的正数。这些数字太大了,无法解释为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/

10-11 02:17