Exception handling in Java allows programs to gracefully deal with errors and unexpected conditions. There are two types of exceptions: checked exceptions which must be explicitly caught, and unchecked exceptions which do not need to be caught. The try-catch block is used to catch exceptions, where code that might throw an exception is placed in the try block and catch blocks handle specific exceptions. Finally blocks are always executed and can be used to perform cleanup tasks. Exceptions can also be explicitly thrown using the throw keyword or declared as thrown from methods using the throws clause.