W3docs

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");   // -7

Un 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.

ApproccioRestituisceUsare quando
Integer.parseInt(s)primitivo intsi vuole eseguire operazioni aritmetiche subito
Integer.valueOf(s)oggetto Integersi ha bisogno di un wrapper per una collezione o i generics
Integer.parseInt(s, radix)primitivo intil 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:

java— editable, runs on the server

Cosa ricavare dall'esecuzione:

  • Integer.parseInt("42") stampa 42 come primitivo int, e Integer.valueOf("42") stampa lo stesso 42 — la differenza è il tipo, un oggetto contro un primitivo, non il valore.
  • L'overload con radix trasforma "ff" in 255, dimostrando che il secondo argomento controlla la base; senza radix il valore predefinito è 10.
  • "12x" viene rifiutato con NumberFormatException il 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 null lancia NumberFormatException (messaggio Cannot parse null string), non NullPointerException — quindi un singolo catch per NumberFormatException copre sia l'input malformato sia quello null.
  • Il metodo helper tryParse taglia gli spazi da " 7 " ottenendo 7 e restituisce absent per "nope", senza mai lanciare eccezioni — questo è il pattern da usare quando un input non valido è normale piuttosto che eccezionale.

Esercitazione

Pratica
Cosa succede quando si chiama Integer.parseInt('3.14') in Java?
Cosa succede quando si chiama Integer.parseInt('3.14') in Java?

Argomenti correlati

Was this page helpful?