Java parseInt: spații, semn și NumberFormatException
Verifică ce acceptă Integer.parseInt în Java: spații, semne și limite. Separă curățarea textului de validare și tratează conversiile eșuate.
În acest material
Integer.parseInt convertește un text într-un int, dar nu ghicește intenția utilizatorului și nu acceptă orice prefix numeric. O conversie corectă începe cu un contract: sunt permise spații la capete, un semn plus, valori negative sau numere dincolo de domeniul int?
Contractul exemplului
În exemplu permitem spații la capete și semnul plus sau minus, dar cerem un singur întreg zecimal care încape în int. Cele patru texte sunt 12 înconjurat de spații, +7, 12x și 2147483648. Afișăm valoarea sau INVALID pentru fiecare.
Exemplu urmărit pas cu pas
După strip, primul text devine 12 și produce 12. Semnul plus din +7 este acceptat și produce 7. Textul 12x este respins integral, iar 2147483648 este respins deoarece depășește cu o unitate Integer.MAX_VALUE.
După strip, primul text devine 12 și produce 12.Mărește schema ↗
Cum funcționează soluția
Aplicăm strip numai pentru că formatul autorizează spațiul alb de la capete. Apelăm apoi parseInt în interiorul unui try restrâns și prindem NumberFormatException. Nu înlocuim eroarea cu zero, deoarece zero este o valoare validă și ar deveni imposibil de deosebit de o conversie eșuată.
Program complet Java 21
public class Main {
public static void main(String[] args) {
String[] values = {" 12 ", "+7", "12x", "2147483648"};
for (String text : values) {
try {
System.out.println(Integer.parseInt(text.strip()));
} catch (NumberFormatException ex) {
System.out.println("INVALID");
}
}
}
}
Salvează programul în Main.java și compilează-l cu javac --release 21 Main.java, apoi rulează java Main. Exemplul include datele de verificare direct în program și nu cere intrare de la tastatură. Rezultatele prezentate mai jos nu depind de data calculatorului, de rețea sau de un serviciu extern.
Corectitudine și cost
Validarea are două niveluri: forma textuală trebuie să reprezinte un întreg acceptat, iar valoarea trebuie să încapă în tipul rezultat. Ambele eșecuri sunt semnalate prin aceeași excepție de conversie. Timpul depinde de numărul caracterelor analizate; nu este necesară construirea unui parser manual pentru acest contract simplu.
Capcana importantă
Nu elimina toate spațiile din interior. Transformarea lui 1 2 în 12 ar schimba datele, nu doar ar curăța marginile. Nu trece prin double înainte de conversia la int: ai introduce alte reguli despre fracții, rotunjire și domeniu, în locul validării unui întreg exact.
Exersează
Înlocuiește textele cu −2147483648, 2147483647, un șir gol și numai semnul plus. Primele două sunt limite valide, iar ultimele două sunt invalide. Dacă domeniul cerut este long, schimbă tipul și metoda de conversie împreună; nu încerca să repari overflow după parseInt.
Dacă sintaxa îți este nouă, începe cu primul program Java. Pentru structura prelucrării, reia tipurile, buclele și metodele. Pentru semnalarea intrărilor neacceptate, consultă excepțiile și colecțiile generice.
Comportamentul API este verificabil în documentația Java 21. Exemplele și explicațiile de aici folosesc contractul restrâns precizat mai sus.
Întrebări frecvente
parseInt elimină automat spațiile?
Nu pentru acest apel. Dacă formatul permite spații la capete, elimină-le explicit înainte de conversie. Această decizie trebuie documentată, pentru a nu accepta accidental un format mai larg decât cel cerut.
De ce 2147483648 este invalid chiar dacă are numai cifre?
Valoarea depășește maximul unui int semnat. Forma numerică este corectă, dar domeniul tipului nu o poate reprezenta; parseInt semnalează eșecul în loc să trunchieze valoarea.
Pot întoarce zero când conversia eșuează?
Numai dacă problema definește explicit acea convenție. De obicei, zero poate fi și o valoare validă, deci un rezultat separat, o excepție sau un tip care exprimă eșecul păstrează informația necesară.