Integer.parseInt(String s, int radix)方法介绍(修正版)

时间:2022-02-07 01:32:13

先来说明一下Integer.parseInt(String s, int radix)的功能。

Integer.parseInt(String s, int radix)就是将整数字符串s(radix用来指明s是几进制)转换成10进制的整数,显然前提是s为整数字符串。比如 s可以为“1314520”、“5201314”等。不可以为“我爱你一生一世”或者“I love you  forever”等之类的非整数字符串。

那么,Integer.pareseInt("10086",10)就是将10进制整数字符串“10086”转换成10进制的整数10086。(有些说法是为了便于表达)

下面我们来了解一下它的具体的内部机制。

 jdk中 java.lang.Integer中的源码如下:

1、

  1. public static int parseInt(String s) throws NumberFormatException
  2. {
  3. );
  4. }

2、

  1. public static int parseInt(String s, int radix)throws NumberFormatException
  2. {
  3. if (s == null) {
  4. throw new NumberFormatException("null");
  5. }
  6. if (radix < Character.MIN_RADIX) {          //Character.MIN_RADIX=2
  7. throw new NumberFormatException("radix " + radix +
  8. " less than Character.MIN_RADIX");
  9. }
  10. if (radix > Character.MAX_RADIX) {          //Character.MAN_RADIX=36
  11. throw new NumberFormatException("radix " + radix +
  12. " greater than Character.MAX_RADIX");
  13. }
  14. ;
  15. boolean negative = false;
  16. , max = s.length();
  17. int limit;
  18. int multmin;
  19. int digit;
  20. ) {
  21. ) == '-') {
  22. negative = true;
  23. limit = Integer.MIN_VALUE;
  24. i++;
  25. } else {
  26. limit = -Integer.MAX_VALUE;
  27. }
  28. multmin = limit / radix;
  29. if (i < max) {
  30. digit = Character.digit(s.charAt(i++),radix);
  31. ) {
  32. throw NumberFormatException.forInputString(s);
  33. } else {
  34. result = -digit;
  35. }
  36. }
  37. while (i < max) {
  38. // Accumulating negatively avoids surprises near MAX_VALUE
  39. digit = Character.digit(s.charAt(i++),radix);
  40. ) {
  41. throw NumberFormatException.forInputString(s);
  42. }
  43. if (result < multmin) {
  44. throw NumberFormatException.forInputString(s);
  45. }
  46. result *= radix;
  47. if (result < limit + digit) {
  48. throw NumberFormatException.forInputString(s);
  49. }
  50. result -= digit;
  51. }
  52. } else {
  53. throw NumberFormatException.forInputString(s);
  54. }
  55. if (negative) {
  56. ) {
  57. return result;
  58. } else {    /* Only got "-" */
  59. throw NumberFormatException.forInputString(s);
  60. }
  61. } else {
  62. return -result;
  63. }
  64. }
我们以Integer.parseInt("110",10)为例。内部的转换过程其实是这样的:
            i=  1*10*10+1*10+0*1; 

若是   Integer.parseInt("111",2)呢?

显然么     i  = 1*2*2+1*2+1*1。为了便于理解,直接这样称呼它们吧: 10进制整数字符串“110”,2进制整数字符串“111”。这时候,还有个问题,就是可以写成Integer.parseInt(“119”, 2)吗?显然是不对滴!2进制数怎么可能出现9呢。如果这样写,系统会抛出java.lang.NumberFormatException异常。

细心的朋友会注意到,在函数内部有这样的约束条件:Character.MAX_RADIX >=  radix >= Character.MIN_RADIX 。                      
根据:Character.MIN_RADIX=2和Character.MAX_RADIX=36 则,parseInt(String s, int radix)参数中  
radix的范围是在2~36之间,超出范围会抛异常。其中s的长度也不能超出7,否则也会抛异常。