Ce face IllegalArgumentException
IllegalArgumentException spune „mi-ai dat o valoare greșită”. O arunci la începutul unei metode, după ce verifici parametrii: o vârstă negativă, un procent peste 100, un text gol unde trebuie un nume. Mesajul trebuie să spună ce valoare a fost primită și ce era permis.
Este neverificată (extinde RuntimeException), deci nu trebuie declarată. Multe metode din JDK o aruncă: Thread.sleep(-1), URI.create cu o adresă greșită, Enum.valueOf cu un nume necunoscut. NumberFormatException este o subclasă a ei.
Excepția înrudită IllegalStateException se folosește când argumentele sunt bune, dar obiectul nu este în starea potrivită (de exemplu, plata unei comenzi deja anulate).
Parametri
| Parametru | Descriere |
|---|---|
mesaj |
Ce valoare a fost primită și ce era așteptat. |
Ce returnează
Un obiect excepție; se aruncă cu throw.
Exemple
Exemplul 1: Validarea parametrilor unui constructor
public class Main {
record Elev(String nume, int nota) {
Elev {
if (nume == null || nume.isBlank()) {
throw new IllegalArgumentException("numele nu poate fi gol");
}
if (nota < 1 || nota > 10) {
throw new IllegalArgumentException("nota trebuie să fie între 1 și 10, primit: " + nota);
}
}
}
public static void main(String[] args) {
Object[][] date = {{"Ana", 9}, {"Mihai", 11}, {" ", 7}};
for (Object[] d : date) {
try {
System.out.println("Creat: " + new Elev((String) d[0], (Integer) d[1]));
} catch (IllegalArgumentException e) {
System.out.println("Respins: " + e.getMessage());
}
}
}
}
Rezultat
Creat: Elev[nume=Ana, nota=9]
Respins: nota trebuie să fie între 1 și 10, primit: 11
Respins: numele nu poate fi gol
Exemplul 2: Metode din JDK care o aruncă
import java.time.DayOfWeek;
public class Main {
public static void main(String[] args) throws InterruptedException {
try {
DayOfWeek.valueOf("LUNI");
} catch (IllegalArgumentException e) {
System.out.println("valueOf: " + e.getMessage());
}
try {
Thread.sleep(-5);
} catch (IllegalArgumentException e) {
System.out.println("sleep: " + e.getMessage());
}
try {
Integer.parseInt("12x");
} catch (IllegalArgumentException e) {
System.out.println("parseInt aruncă " + e.getClass().getSimpleName() + ", tot o IllegalArgumentException");
}
}
}
Rezultat
valueOf: No enum constant java.time.DayOfWeek.LUNI
sleep: timeout value is negative
parseInt aruncă NumberFormatException, tot o IllegalArgumentException
Exemplul 3: IllegalStateException pentru o stare greșită
public class Main {
static class Comanda {
private boolean anulata;
void anuleaza() {
anulata = true;
}
void plateste(int suma) {
if (suma <= 0) throw new IllegalArgumentException("suma trebuie să fie pozitivă: " + suma);
if (anulata) throw new IllegalStateException("comanda este anulată, nu se mai poate plăti");
System.out.println("Plătit " + suma + " lei");
}
}
public static void main(String[] args) {
Comanda c = new Comanda();
c.plateste(120);
c.anuleaza();
try {
c.plateste(120);
} catch (IllegalStateException e) {
System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
}
}
}
Rezultat
Plătit 120 lei
IllegalStateException: comanda este anulată, nu se mai poate plăti
Greșeli frecvente
- Arunci excepția fără mesaj. „IllegalArgumentException” fără detalii nu spune ce valoare era greșită.
- Verifici argumentele abia la mijlocul metodei, după ce ai modificat deja date. Verifică la început, ca obiectul să rămână neschimbat.
Comenzi înrudite
NumberFormatException: Apare când un text nu poate fi transformat în număr: Integer.parseInt(„12a”), „3,14” cu virgulă, text gol.RuntimeException: Clasa de bază a excepțiilor neverificate: nu trebuie declarate cu throws și nici prinse obligatoriu.NullPointerException: Apare când folosești o referință null ca pe un obiect (apelezi o metodă, citești un câmp); mesajul spune ce era null.Exception: Clasa de bază pentru erorile pe care un program le poate trata; getMessage() returnează mesajul dat la creare.