Java divides exceptions into categories based on whether the compiler forces you to handle them.
Checked exceptions extend Exception but not RuntimeException. The compiler requires you to either catch them or declare them with throws. Examples include IOException and FileNotFoundException. These represent external failures your code should anticipate.
Unchecked exceptions extend RuntimeException. The compiler does not force you to handle them. Examples include NullPointerException and ArithmeticException. These usually indicate programming bugs.
If you forget to handle a checked exception, your code will not compile. If you forget to handle an unchecked exception, your code compiles but crashes at runtime.