为什么这个浮点文本值可以解析为double?

时间:2013-03-08 11:09:24

标签: java try-catch numberformatexception

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

中有一个P.

3 个答案:

答案 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抛出。

相关问题