Wyjątki checked muszą być obsłużone lub zadeklarowane w throws (np. IOException) i zwykle oznaczają sytuacje możliwe do obsłużenia. Wyjątki unchecked dziedziczą po RuntimeException (np. NullPointerException) i najczęściej wskazują błąd programisty; ich obsługa jest opcjonalna.