An exception occurs when the normal flow of a program is disrupted, such as dividing by zero or accessing an out-of-bounds array element. Exceptions are handled using try-catch blocks to catch specific exceptions or finally blocks to clean up resources. Methods can throw exceptions using the throw statement or specify thrown exceptions in the method declaration using throws. Programmers can also create custom exception classes by extending the Exception class.