Come convertire una String in int in Java
Converti una stringa Java in int con Integer.parseInt e Integer.valueOf e gestisci la NumberFormatException.
Trasformare testo come "42" nel numero 42 è una delle operazioni più comuni in Java — si ripresenta ogni volta che si leggono argomenti da riga di comando, si analizza un valore di configurazione o si elabora un input di un modulo. Il JDK mette a disposizione un paio di strumenti in una sola riga nella classe Integer, oltre a un chiaro meccanismo di errore quando il testo non è un numero valido. Questo capitolo mostra gli approcci idiomatici e come gestire i casi problematici.
Integer.parseInt — il primitivo int che di solito si vuole
Integer.parseInt(String) è lo strumento principale. Legge il testo e restituisce un primitivo int:
int count = Integer.parseInt("42"); // 42
int neg = Integer.parseInt("-7"); // -7Un segno + o - iniziale è consentito, ma nient'altro: spazi circostanti, punti decimali, underscore o lettere causano tutti un errore. Se è possibile che ci siano spazi bianchi, eliminarli prima con s.trim() (o s.strip() su Java 11+). Esiste anche un overload che accetta un radix, quindi Integer.parseInt("ff", 16) legge l'esadecimale e restituisce 255.
Integer.valueOf — quando si ha bisogno di un oggetto Integer
Integer.valueOf(String) esegue la stessa analisi ma restituisce un Integer (il wrapper boxed) anziché un primitivo int. Usarlo quando il valore va direttamente in una collezione come List<Integer> o ovunque sia richiesto un riferimento a oggetto. Come ulteriore vantaggio, valueOf mette in cache le istanze boxed per valori piccoli (da −128 a 127), quindi può essere marginalmente più economico di parseInt seguito dall'autoboxing.
| Approccio | Restituisce | Usare quando |
|---|---|---|
Integer.parseInt(s) | primitivo int | si vuole eseguire operazioni aritmetiche subito |
Integer.valueOf(s) | oggetto Integer | si ha bisogno di un wrapper per una collezione o i generics |
Integer.parseInt(s, radix) | primitivo int | il testo è in base 2, 8, 16, ecc. |
Gestione dell'input non valido con NumberFormatException
Entrambi i metodi lanciano una NumberFormatException non verificata quando la stringa non è un intero analizzabile — "12x", "3.14", "" o null falliscono tutti. Poiché è non verificata, il compilatore non obbliga a catturarla, quindi spetta a chi scrive il codice proteggere gli input che non si controllano:
String raw = userInput();
try {
int value = Integer.parseInt(raw.trim());
// ... use value
} catch (NumberFormatException e) {
System.out.println("Not a whole number: " + raw);
}Quando l'analisi "è previsto che fallisca a volte" e non si vogliono eccezioni nel flusso di controllo, è utile racchiuderla in un metodo helper che restituisce un OptionalInt invece di lanciare un'eccezione. Questo trasforma un try/catch in un semplice controllo isPresent() nel punto di chiamata. Vedi Java Optional per il pattern più ampio, e Java try-catch per la meccanica di cattura dell'eccezione.
Un esempio concreto: tutti gli approcci fianco a fianco
Questo programma esegue ogni tecnica di conversione e i due casi di errore, così si può vedere esattamente cosa restituisce o stampa ciascuno:
Cosa ricavare dall'esecuzione:
Integer.parseInt("42")stampa42come primitivoint, eInteger.valueOf("42")stampa lo stesso42— la differenza è il tipo, un oggetto contro un primitivo, non il valore.- L'overload con radix trasforma
"ff"in255, dimostrando che il secondo argomento controlla la base; senza radix il valore predefinito è 10. "12x"viene rifiutato conNumberFormatExceptionil cui messaggio èFor input string: "12x"— l'eccezione indica il testo esatto che ha causato il fallimento, il che la rende utile nei log.- Passare
nulllanciaNumberFormatException(messaggioCannot parse null string), nonNullPointerException— quindi un singolo catch perNumberFormatExceptioncopre sia l'input malformato sia quello null. - Il metodo helper
tryParsetaglia gli spazi da" 7 "ottenendo7e restituisceabsentper"nope", senza mai lanciare eccezioni — questo è il pattern da usare quando un input non valido è normale piuttosto che eccezionale.
Esercitazione
Argomenti correlati
- Come convertire un int in una String in Java — la direzione inversa.
- Java Exceptions — informazioni di base su
NumberFormatExceptione la famiglia delle eccezioni non verificate. - Java Data Types — la differenza tra il primitivo
inte il wrapperInteger.