Checked exceptions must be declared or handled at compile time (they extend `Exception` but not `RuntimeException`). Unchecked exceptions (`RuntimeException`) don’t require it and usually indicate programming errors or invalid state.
Checked exceptions are part of the method’s contract: callers must handle them (try/catch) or declare them (throws). Unchecked exceptions are not enforced by the compiler.
Rule of thumb: