Lesson 28 / 38
Exceptions
Handle failures with try / catch / finally, tell checked from unchecked exceptions, free resources with try-with-resources, and never swallow errors silently.
Checked vs unchecked
Checked exceptions (subclasses of Exception, not RuntimeException) must be declared with throws or caught — the compiler enforces it, e.g. IOException. Unchecked (RuntimeException, e.g. NullPointerException) usually signal bugs and need no declaration.
try-with-resources
Anything implementing AutoCloseable declared in the try (...) header is closed automatically, in reverse order, even if an exception is thrown. finally still runs for other cleanup.
try (var reader = Files.newBufferedReader(path)) {
return reader.readLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}Don't swallow exceptions
An empty catch block hides failures and makes bugs invisible. At minimum log it with the stack trace, or rethrow wrapped with context.