今天项目中碰到一个parseLong()方法,传入的是一个String类型,得到一个Long,一开始感觉不就是类型转换嘛,后来发现还是有点小坑的。
首先parseLong(String str)它还会去调用一个更深的parseLong(String str, int radix),如果不传入的话,radix默认为10 ,那么这个方法究竟怎么工作的呢?
简单来说,就是将str按照radix的进制来转换,比如默认是10的话,那么parseLong("99", 10)得到的结果就是99 。既然如此,是不是觉得没啥大不了的,那么parseLong("99",8)会得到什么呢?直接将99转换成8进制应该得到143吧,那么就错咯,它会报错NumberFormatException,那么来读一下源码
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Long.MIN_VALUE;
} else if (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;
}
}
大概能发现,它是按照从第一位开始,每一位都不能超过这个radix。
网友评论