Effective Java Third Edition Chapter 10 Exception
Item 70
Throw checked exceptions for recoverable conditions and unchecked exceptions for programming errors.
When in doubt, throw unchecked exceptions. Don’t define any throwables that are neither checked exceptions nor runtime exceptions. Provide methods on your checked exceptions to aid in recovery.
Item 71 Avoid unnecessary use of checked exceptions.
Checked exceptions can increase the reliability of programs; when overused, they make APIs painful to use.
If callers won’t be able to recover from failures, throw unchecked exceptions. If recovery may be possible and you want to force callers to handle exceptional conditions, first consider returning an optional. Only if this would provide insufficient information in the case of failure should you throw a checked exception.