publicstaticintparseInt(String s,int radix)throws NumberFormatException
{/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/if(s == null){thrownewNumberFormatException("null");}if(radix < Character.MIN_RADIX){//最小进制是二进制thrownewNumberFormatException("radix "+ radix +" less than Character.MIN_RADIX");}if(radix > Character.MAX_RADIX){//最大进制是36进制thrownewNumberFormatException("radix "+ radix +" greater than Character.MAX_RADIX");}int result =0;boolean negative =false;int i =0, len = s.length();int limit =-Integer.MAX_VALUE;int multmin;int digit;if(len >0){char firstChar = s.charAt(0);if(firstChar <'0'){// Possible leading "+" or "-"if(firstChar =='-'){
negative =true;
limit = Integer.MIN_VALUE;}elseif(firstChar !='+')throw NumberFormatException.forInputString(s);if(len ==1)// Cannot have lone "+" or "-"throw NumberFormatException.forInputString(s);
i++;}
multmin = limit / radix;while(i < len){// Accumulating negatively avoids surprises near MAX_VALUE ,这里有点疑惑为什么要用负值计算???????
digit = Character.digit(s.charAt(i++),radix);if(digit <0){throw NumberFormatException.forInputString(s);}if(result < multmin){//这里可以理解throw NumberFormatException.forInputString(s);}
result *= radix;if(result < limit + digit){throw NumberFormatException.forInputString(s);}
result -= digit;}}else{throw NumberFormatException.forInputString(s);}return negative ? result :-result;}