Kurz erklärt
Laufzeitfehler, die mit try/catch gezielt abgefangen und behandelt werden können, statt das ganze Programm abstürzen zu lassen.
Genauer
Java unterscheidet geprüfte Exceptions (checked, z. B. IOException — der Compiler zwingt zum Abfangen oder Weiterreichen) und ungeprüfte (unchecked, z. B. NullPointerException — Compiler prüft nichts, meist Programmierfehler statt erwartbarer Zustand). Ein finally-Block läuft immer, egal ob eine Exception geworfen wurde oder nicht — typisch für Aufräumarbeiten.