Exceptions alter normal program flow. A try block contains risky code, and a catch clause handles any exceptions thrown. A finally block always executes. All exceptions extend the Exception class. Runtime exceptions are unchecked, while other exceptions like IOException must be caught or declared. Exceptions can be rethrown with a modified type. The JVM throws exceptions like NullPointerException, while exceptions like NumberFormatException are thrown programmatically.