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; 
      }  
   }
}

注意里面有个P.parseFloat("0xabcP2f"));

4

3 回答 3

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

关于NumberFormatException抛出valueOf

其中 Sign、FloatingPointLiteral、HexNumeral、HexDigits、SignedInteger 和 FloatTypeSuffix 在 Java 语言规范的词法结构部分中定义。如果 s 不具有 FloatValue 的形式,则抛出 NumberFormatException。

关于 p 在十六进制中的使用:P 在常量声明中

于 2013-03-08T11:13:58.403 回答
3
 System.out.println(new FlIndeed().parseFloat("0xabcP2f"));

0xabcP2f 是一个 HexSignificand 值,对于 Float.valueOf("0xabcP2f") 是合法的。所以它不会抛出任何异常

有关详细信息,请查看此 http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html#valueOf%28java.lang.String%29

于 2013-03-08T11:16:02.837 回答
2

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

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

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

于 2013-03-08T11:13:51.217 回答