IllegalArgumentException în Java

Excepția aruncată când o metodă primește un argument cu valoare nepermisă (vârstă negativă, lună 13).

Sintaxă
public class IllegalArgumentException extends RuntimeException

throw new IllegalArgumentException("mesaj");

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.