Exceptions
Handle failure like a professional: exceptions, try/catch/finally, checked vs unchecked, custom exceptions, try-with-resources and helpful NPEs.
Programs meet trouble all the time: a file isn't there, a number won't parse, the network drops, a value is null when nobody expected it. Java's answer is the exception: an object that describes what went wrong, thrown at the point of failure and caught by code that knows what to do about it. Done well, exceptions keep the happy path readable and make failures loud and easy to diagnose. Done badly, they swallow bugs, leak files and connections, and turn a one-line fix into a day of log-reading.
This phase starts with what an exception really is (an object on the heap, a walk up the call stack, a table in the bytecode), then the try/catch/finally statement, the checked/unchecked split that makes Java unique, throw and throws, writing your own exception types, try-with-resources (Java 7) for closing things safely, multi-catch and precise rethrow, and finally the habits senior engineers rely on, including the helpful NullPointerException messages added in Java 14.
It builds on Phase 5 (inheritance and polymorphism: the exception hierarchy is a class hierarchy, and catch matches by subtype) and Topic 3.x's call stack. Later phases lean on it constantly: collections throw ConcurrentModificationException (Topic 9.9), streams and lambdas complicate checked exceptions (Phase 10), and file I/O and concurrency are built around IOException and InterruptedException.