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

16 進数値を受け入れ、有効な 16 進数値を渡しているためです。

From 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 がスローされます。

16 進数での p の使用について:定数宣言での P

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

0xabcP2fは、Float.valueOf( "0xabcP2f")に対して有効なHexSignificand値です。したがって、例外はスローされません

詳細については、こちらの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 が正規化された表現の float 値の場合、仮数フィールドと指数フィールドを表すために部分文字列が使用されます。仮数は文字「0x1」で表されます。その後に、仮数部の残りを分数として小文字の 16 進数で表したものが続きます。16 進表現の末尾のゼロは、すべての桁がゼロでない限り削除されます。ゼロの場合は、単一のゼロが使用されます。次に、指数は、指数値で Integer.toString への呼び出しによって生成されたかのように、バイアスのない指数の 10 進文字列が続く "p" で表されます。

NumberFormatExceptionしたがって、入力した16進数文字列の指数を表すために使用されます。これは16進数文字列の完全に正当な部分であるため、解析エラーやスローはありません。

于 2013-03-08T11:13:51.217 に答える