Checked exceptions muszą być obsłużone lub zadeklarowane w sygnaturze (dziedziczą po `Exception`, ale nie po `RuntimeException`). Unchecked (`RuntimeException`) nie wymagają tego i zwykle oznaczają błąd programistyczny lub niepoprawny stan.
Checked wyjątki są częścią kontraktu metody: wywołujący musi je obsłużyć (try/catch) albo zadeklarować (throws). Unchecked nie są wymuszane przez kompilator.
Reguła kciuka: