有人知道为什么以下代码段不会抛出NumberFormatException
吗?
public class FlIndeed {
public static void main(String[] args) {
System.out.println(new FlIndeed().parseFloat("0xabcP2f"));
}
public float parseFloat(String s) {
float f = 0.0f;
try {
f = Float.valueOf(s).floatValue();
return f;
}
catch (NumberFormatException nfe) {
System.out.println("Invalid input " + s);
}
finally {
System.out.println("It's time to get some rest");
return f;
}
}
}
请注意,.parseFloat("0xabcP2f"));
答案 0 :(得分:7)
因为它接受十六进制值并且您传递的是有效的十六进制值。
来自Doc(s =输入字符串参数)
应该构成一个FloatValue,如词法语法所描述的那样 规则:
FloatValue: Signopt NaN Signopt Infinity Signopt FloatingPointLiteral Signopt HexFloatingPointLiteral SignedInteger HexFloatingPointLiteral: HexSignificand BinaryExponent FloatTypeSuffixopt HexSignificand: HexNumeral HexNumeral . 0x HexDigitsopt . HexDigits 0X HexDigitsopt . HexDigits BinaryExponent: BinaryExponentIndicator SignedInteger BinaryExponentIndicator: p P
从NumberFormatException
valueOf
左右
其中Sign,FloatingPointLiteral,HexNumeral,HexDigits,SignedInteger 和FloatTypeSuffix在词法结构部分中定义 Java语言规范的。如果s没有表格 一个FloatValue,然后抛出NumberFormatException。
关于在十六进制中使用p:P in constant declaration
答案 1 :(得分:3)
System.out.println(new FlIndeed().parseFloat("0xabcP2f"));
0xabcP2f是一个HexSignific和值,对于Float.valueOf(“0xabcP2f”)来说是合法的。 所以它不会抛出任何异常
详情请看看 http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html#valueOf%28java.lang.String%29
答案 2 :(得分:2)
http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html
如果m是具有规范化表示的浮点值,则子串用于表示有效数和指数字段。有效数字由字符“0x1”表示。其次是有效数字的其余部分的小写十六进制表示形式。除非所有数字都为零,否则将删除十六进制表示中的尾随零,在这种情况下使用单个零。 接下来,指数由“p”表示,后跟无偏指数的十进制字符串,就好像是通过对指数值调用Integer.toString产生的。
因此,它用于表示您输入的十六进制字符串中的指数,它是十六进制字符串的完全合法部分,因此没有解析错误且没有NumberFormatException
抛出。