2011-08-26 15 views
18

Le eccezioni di runtime indicano un contratto interrotto (come NPE) e non dovrebbero mai essere generate se il codice non ha errori. Indica sempre errori nel codice (come asserisce, ma asserisce errori di classe interni mentre Runtime è per errori client della classe).Perché NumberFormatException è di runtime?

Le eccezioni di runtime non dovrebbero mai essere intercettate.

Le eccezioni controllate, d'altra parte, fanno parte della firma e devono essere catturate ed elaborate. Possono indicare errori di input dell'utente o problemi di risorse esterne (come IOException).

Con tutto questo non riesco a capire perché NumberFormatException è di runtime?

+2

Senza codice nessuno può rispondere. – RoflcoptrException

+1

Come il modo in cui il compilatore non sa che un oggetto è nullo quando qualcosa viene utilizzato su di esso, non sa se la stringa che viene analizzata è in realtà un numero o meno. È un'eccezione che si verifica solo durante il runtime. – asgs

+12

@Roflcoptr: sta chiedendo perché NumberFormatException è un'eccezione Runtime, non perché lo sta ricevendo. – Vache

risposta

0

Perché NumberFormatException è un errore di runtime? Bene, se hai una finestra di dialogo in cui l'utente inserisce un valore, e il valore non è un numero ma viene analizzato come tale, vorresti saperlo. È un'eccezione il modo migliore? Forse no, ma è quello che è.

+2

Credo che la domanda sia una sottoclasse di RuntimeException invece di una semplice eccezione, che non è un'eccezione controllata. –

8

In primo luogo, chi ti ha detto

eccezioni runtime non dovrebbero mai essere catturati

non so molto di Java. Non ascoltarli - hanno torto.

NumberFormatException è un'eccezione di runtime: le eccezioni non selezionate vengono scelte perché indicano un errore di programmazione . È possibile conoscere prima del chiamando Integer.parseInt() (ad esempio) che una stringa è un numero intero valido, ad es. qui è solo un modo:

if (str.matches("^\\d{1,8}$") { 
    int myInt = Integer.parseInt(str); // will never throw NumberFormatException 
} 

Pertanto, può essere considerato un errore di programmazione per ottenere sempre uno - il programmatore ha scelto di non controllo prima.

Se non si è sicuri circa l'integrità/qualità della stringa che si sta per analizzare, è facile da prendere:

try { 
    // parse your string 
} catch (NumberFormatException e) { 
    // do something about it 
} 

L'altro motivo per renderlo un runtime è che non è così disordine il codice con blocchi try/catch potenzialmente inutili, se si è certi che non si otterrà uno, ad esempio se fidarsi completamente dell'origine dei dati String.

+7

Tuttavia, lo stesso si potrebbe dire di alcune eccezioni controllate come "URLFormatThingyException" e cosa avete. In breve, è tutto un casino. –

+1

e lo stesso - verificando in anticipo - potrebbe anche essere detto su NPE! –

+1

assolutamente! Controllo sempre per NPE: 'if (str! = Null && ...)' etc – Bohemian

2

NumberFormatException estende IllegalArgumentException. Il motivo per cui si tratta di un'eccezione di runtime è che è completamente possibile interrompere il contratto di un metodo che prende uno String e restituisce un Number. Se passo in 123D e non c'è una convalida corretta dei dati di questo sarebbe un argomento illegale appropriato.

3

NumberFormatException potrebbe essere generato durante l'analisi dei file di configurazione, nel qual caso si tratterebbe di un errore del programmatore. Quando si analizza l'input dell'utente, di solito si utilizza NumberFormat che genera un controllo ParseException.

+0

I file di configurazione non sono sempre (o anche spesso) sotto il controllo del programmatore, ma penso che il tuo punto sia ben fatto. Le librerie Java forniscono API distinte per la gestione dell'input da una fonte attendibile rispetto all'input da una fonte non attendibile. – CurtainDog

+0

sì! è stato fortunato e ha trovato questa risposta, questo spiega perché NumberFormat vada a controllare ParseException, mentre Integer.parseInt genera un'eccezione di runtime. buon punto sui file di configurazione, cioè credo esattamente come è stato progettato e pensato per essere usato - NumerFormat per l'input dell'utente, Integer.parseInt per tutto il resto –

0

In un certo senso, NumberFormatExceptionè un'eccezione in fase di compilazione. Ma invece di essere lanciato dal compilatore Java, viene generato dal parser/compilatore di stringhe di formato quando viene eseguito dal programma.Lo stesso vale per Pattern e altri usi delle espressioni regolari; il tuo programma sta eseguendo il parser/compilatore.

Problemi correlati