2013-03-08 8 views
6

Qualcuno sa perché il seguente frammento non getta un NumberFormatException?Perché questo valore di testo in virgola mobile può essere analizzato come un doppio?

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

noti che esiste un P all'interno .parseFloat("0xabcP2f"));

risposta

7

Perché accetta valori esadecimali e sta passando un valore esadecimale valido.

Da Doc (s = ingresso argomento String)

s dovrebbe costituire una FloatValue come descritto dalla sintassi lessicale regole:

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 

circa NumberFormatException gettata da valueOf

dove Sign, FloatingPointLiteral, HexNumeral, HexDigits, SignedInteger e FloatTypeSuffix sono come definiti nelle sezioni della struttura lessicale della Specifica linguaggio Java. Se s non ha il formato di un FloatValue, viene generata una NumberFormatException.

Circa uso di p in esadecimale: P in constant declaration

2

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

Se m è un valore decimale con una rappresentazione normalizzata, sottostringhe sono utilizzati per rappresentare i campi significando e esponente. Il significato è rappresentato dai caratteri "0x1". seguito da una rappresentazione esadecimale minuscola del resto del significato e come una frazione. Gli zeri finali nella rappresentazione esadecimale vengono rimossi a meno che tutte le cifre siano zero, nel qual caso viene utilizzato uno zero singolo. Successivamente, l'esponente è rappresentato da "p" seguito da una stringa decimale dell'esponente imparziale come se fosse prodotta da una chiamata a Integer.toString sul valore esponenziale.

Quindi è utilizzato per indicare l'esponente nella stringa esadecimale quale si è entrati, si tratta di una parte perfettamente legale della stringa esadecimale quindi non c'è alcun errore di analisi e nessuna NumberFormatException gettati.