Java handles two types of exceptions - unchecked exceptions and checked exceptions. Unchecked exceptions do not need to be handled by programmers, while checked exceptions must be handled. Checked exceptions are environment or server-related issues outside a programmer's control. There are three ways to handle checked exceptions: try-catch blocks, throwing exceptions with the throw keyword, or specifying exceptions with the throws keyword in method signatures. Finally blocks are used to ensure cleanup code executes after try or catch blocks complete.