2013-03-08 33 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拋出。

相關問題