2013-03-08 94 views
6

有谁知道为什么下面的代码不会抛出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"));

回答

7

因为它确实接受十六进制值,并且您正在传递有效的十六进制值。

Doc(S =输入的字符串参数)

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 

NumberFormatExceptionvalueOf

抛出

其中Signature,FloatingPointLiteral,HexNumeral,HexDigits,SignedInteger 和FloatTypeSuffix在Java语言规范的词汇结构部分 中定义。如果s不具有FloatValue的形式 ,则引发NumberFormatException。

关于以十六进制使用P的:P in constant declaration

2

http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html

如果m是具有的归一化表示的浮动值的P,则使用子表示有效数字和指数字段。有效数字由字符“0x1”表示。接着是剩余有效数的小写十六进制表示作为分数。除非所有数字均为零,否则十六进制表示法中的尾随零将被删除,在这种情况下,将使用一个零。 接下来,指数用“p”表示,后面跟随无偏指数的十进制串,就好像通过对指数值调用Integer.toString产生的一样。

所以它是用来表示在你输入的十六进制字符串的指数,它的十六进制字符串的完全合法的部分,所以没有解析错误,没有NumberFormatException抛出。