Back to Java
2026-01-165 min read

Java Exceptions

Learn Java Exceptions step by step with clear examples and exercises.

Why This Matters

Java exceptions are essential for handling errors in Java programming. They help developers anticipate, identify, and manage runtime errors that might occur during program execution. In this guide, we'll delve into the core concept of Java exceptions, provide a worked example, discuss common mistakes, offer practice questions, and answer frequently asked questions.

Prerequisites

To fully grasp the concept of Java exceptions, you should have a solid understanding of the following:

  1. Basic Java syntax and programming constructs, such as variables, loops, and control structures.
  2. Understanding of classes and objects in Java.
  3. Familiarity with Java's input/output (I/O) streams and file handling.
  4. Knowledge of the if and try-catch blocks in Java.

Core Concept

In Java, exceptions represent exceptional conditions that occur during program execution. They are instances of the Throwable class or its subclasses, such as Error, RuntimeException, and Exception. The primary purpose of exceptions is to provide a way for methods to communicate errors back to the calling code.

Exception Hierarchy

The Java exception hierarchy is organized into two main categories: Error and Exception.

  1. Error: These are irrecoverable errors that occur during program execution, such as OutOfMemoryError or StackOverflowError. They cannot be handled by try-catch blocks and should not be caught by the application.
  2. Exception: These are recoverable exceptions that can be handled by the application. There are two types of exceptions: checked exceptions (extending Exception) and unchecked exceptions (extending RuntimeException).

Checked Exceptions vs Unchecked Exceptions

Checked exceptions must be declared in a method's throws clause or caught within the method itself, while unchecked exceptions do not require a throws clause and can be handled or ignored at the developer's discretion.

Throwing Exceptions

To throw an exception from a Java program, you use the throw keyword followed by an instance of a subclass of Throwable. For example:

public class MyClass {
public void myMethod() throws IOException {
// Some code that might throw an IOException
throw new IOException("An error occurred");
}
}

Catching Exceptions

To catch an exception, you use a try-catch block. The general structure is as follows:

try {
// Code that might throw an exception
} catch (ExceptionType1 e1) {
// Handle exception of type ExceptionType1
} catch (ExceptionType2 e2) {
// Handle exception of type ExceptionType2
} finally {
// Cleanup code that should always be executed, regardless of whether an exception occurred or not
}

Worked Example

Let's consider a simple example where we read data from a file and process it. However, the file might not exist, or there might be an issue with reading the file. We can use exceptions to handle these potential issues:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReader {
public static void main(String[] args) {
try {
File file = new File("example.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
scanner.close();
} catch (FileNotFoundException e) {
System.err.println("Error: File not found.");
}
}
}

In this example, we use a try-catch block to handle the potential exception thrown by the Scanner when the specified file is not found. If an error occurs, we print an error message and continue with the rest of the program.

Common Mistakes

  1. ### Not catching exceptions that should be handled

Failing to catch exceptions that can potentially occur in your code may lead to unhandled errors and program crashes. Make sure to handle all exceptions that might affect the normal execution of your program.

  1. ### Ignoring the stack trace when an exception occurs

When an exception occurs, it's essential to examine the stack trace for information about the error location and cause. Ignoring the stack trace can make it challenging to diagnose and fix errors.

  1. ### Not declaring checked exceptions in the method signature

If your method might throw a checked exception, you must declare it in the method's throws clause or catch it within the method. Failing to do so will result in a compile-time error.

  1. ### Overusing exceptions for regular flow control

Exceptions should be used for exceptional conditions, not as an alternative to regular flow control structures like if and for loops. Misusing exceptions can make your code harder to read and maintain.

Practice Questions

  1. Write a Java program that reads data from two files, "file1.txt" and "file2.txt". If either file is not found, print an error message and continue with the other file.
  2. Create a custom exception class MyCustomException that extends RuntimeException. Write a method that might throw this exception and handle it using a try-catch block in the same class.
  3. Modify the previous example to read data from multiple files and print the lines that contain the word "exception". If any file is not found, print an error message for that file and continue with the remaining files.

FAQ

  1. Why should I use exceptions in my Java code?

Exceptions help you handle runtime errors gracefully, preventing program crashes and ensuring your application remains functional even when faced with unexpected conditions.

  1. What is the difference between checked and unchecked exceptions in Java?

Checked exceptions must be declared in a method's throws clause or caught within the method itself, while unchecked exceptions do not require a throws clause and can be handled or ignored at the developer's discretion.

  1. How can I create my custom exception class in Java?

To create a custom exception class, extend the RuntimeException class and provide an appropriate constructor to pass error messages or other relevant information.

Java Exceptions | Java | XQA Learn