Exception Handling Keywords in Java

Introduction

Exception handling in Java is a powerful mechanism that allows developers to handle runtime errors, ensuring the smooth execution of programs. Java provides several keywords to handle exceptions effectively: try, catch, finally, throw, and throws. This blog post will explore these keywords, their usage, and how they work together to manage exceptions, including handling multiple exceptions and using nested try blocks.

Table of Contents

  1. The try Keyword
  2. The catch Keyword
  3. The finally Keyword
  4. The throw Keyword
  5. The throws Keyword
  6. Multiple catch Blocks
  7. Nested try Blocks
  8. Complete Example Program
  9. Conclusion

1. The try Keyword

The try keyword is used to define a block of code that will be tested for exceptions during its execution. If an exception occurs within the try block, it is thrown.

Syntax:

try {
    // Code that might throw an exception
}

Example:

public class TryExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // This will throw ArithmeticException
        }
    }
}

Explanation:

  • The try block contains code that might throw an exception. If an exception occurs, it will be caught by the corresponding catch block.

2. The catch Keyword

The catch keyword is used to handle the exception that occurs in the associated try block. You can have multiple catch blocks to handle different types of exceptions.

Syntax:

try {
    // Code that might throw an exception
} catch (ExceptionType e) {
    // Code to handle the exception
}

Example:

public class CatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // This will throw ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}

Output:

Caught exception: / by zero

Explanation:

  • The catch block handles the ArithmeticException thrown by the try block.

3. The finally Keyword

The finally keyword is used to define a block of code that will always execute, regardless of whether an exception was thrown or caught. It is typically used for resource cleanup.

Syntax:

try {
    // Code that might throw an exception
} catch (ExceptionType e) {
    // Code to handle the exception
} finally {
    // Code that will always execute
}

Example:

public class FinallyExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // This will throw ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("Caught exception: " + e.getMessage());
        } finally {
            System.out.println("Finally block executed.");
        }
    }
}

Output:

Caught exception: / by zero
Finally block executed.

Explanation:

  • The finally block is executed after the catch block, regardless of whether an exception was thrown.

4. The throw Keyword

The throw keyword is used to explicitly throw an exception. You can throw both built-in and custom exceptions using this keyword.

Syntax:

throw new ExceptionType("Exception message");

Example:

public class ThrowExample {
    public static void main(String[] args) {
        try {
            validateAge(15); // This will throw an IllegalArgumentException
        } catch (IllegalArgumentException e) {
            System.out.println("Caught exception: " + e.getMessage());
        }
    }

    public static void validateAge(int age) {
        if (age < 18) {
            throw new IllegalArgumentException("Age must be 18 or older.");
        }
        System.out.println("Age is valid.");
    }
}

Output:

Caught exception: Age must be 18 or older.

Explanation:

  • The validateAge method throws an IllegalArgumentException if the age is less than 18.

5. The throws Keyword

The throws keyword is used in a method signature to declare that the method might throw one or more exceptions. This informs the caller of the method about the exceptions it might throw, allowing them to handle these exceptions.

Syntax:

returnType methodName(parameterList) throws ExceptionType1, ExceptionType2 {
    // Method body
}

Example:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            readFile("example.txt");
        } catch (FileNotFoundException e) {
            System.out.println("Caught exception: " + e.getMessage());
        }
    }

    public static void readFile(String fileName) throws FileNotFoundException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        System.out.println("File read successfully");
    }
}

Output:

Caught exception: example.txt (No such file or directory)

Explanation:

  • The readFile method declares that it throws a FileNotFoundException.
  • The caller of readFile must handle the exception, as shown in the main method.

6. Multiple catch Blocks

A method can have multiple catch blocks to handle different types of exceptions separately.

Example:

public class MultipleCatchExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[10]); // This will throw ArrayIndexOutOfBoundsException
            int result = 10 / 0; // This will throw ArithmeticException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Array index out of bounds: " + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("Arithmetic error: " + e.getMessage());
        }
    }
}

Output:

Array index out of bounds: Index 10 out of bounds for length 3

Explanation:

  • The first catch block handles ArrayIndexOutOfBoundsException.
  • The second catch block handles ArithmeticException.
  • Only the first exception that occurs (ArrayIndexOutOfBoundsException) is caught and handled.

7. Nested try Blocks

You can nest try blocks inside each other to handle exceptions that might occur within multiple levels of operations.

Example:

public class NestedTryExample {
    public static void main(String[] args) {
        try {
            System.out.println("Outer try block");
            try {
                int result = 10 / 0; // This will throw ArithmeticException
            } catch (ArithmeticException e) {
                System.out.println("Inner catch: Arithmetic error: " + e.getMessage());
            }
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[10]); // This will throw ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Outer catch: Array index out of bounds: " + e.getMessage());
        } finally {
            System.out.println("Outer finally block");
        }
    }
}

Output:

Outer try block
Inner catch: Arithmetic error: / by zero
Outer catch: Array index out of bounds: Index 10 out of bounds for length 3
Outer finally block

Explanation:

  • The inner try block handles the ArithmeticException.
  • The outer try block handles the ArrayIndexOutOfBoundsException.
  • The finally block is executed after both catch blocks.

8. Complete Example Program

Here is a complete program that demonstrates the use of all the exception handling keywords in Java, including multiple catch blocks and nested try blocks.

Example Code:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

// Custom exception
class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        // Example 1: Using try-catch-finally
        try {
            int result = 10 / 0; // This will throw ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("Caught ArithmeticException: " + e.getMessage());
        } finally {
            System.out.println("Finally block executed.");
        }

        // Example 2: Using throw with a built-in exception
        try {
            validateAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println("Caught IllegalArgumentException: " + e.getMessage());
        }

        // Example 3: Using throws with a built-in exception
        try {
            readFile("example.txt");
        } catch (FileNotFoundException e) {
            System.out.println("Caught FileNotFoundException: " + e.getMessage());
        }

        // Example 4: Using throw with a custom exception
        try {
            validateCustomAge(

15);
        } catch (InvalidAgeException e) {
            System.out.println("Caught custom exception: " + e.getMessage());
        }

        // Example 5: Multiple catch blocks
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[10]); // This will throw ArrayIndexOutOfBoundsException
            int result = 10 / 0; // This will throw ArithmeticException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Array index out of bounds: " + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("Arithmetic error: " + e.getMessage());
        }

        // Example 6: Nested try blocks
        try {
            System.out.println("Outer try block");
            try {
                int result = 10 / 0; // This will throw ArithmeticException
            } catch (ArithmeticException e) {
                System.out.println("Inner catch: Arithmetic error: " + e.getMessage());
            }
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[10]); // This will throw ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Outer catch: Array index out of bounds: " + e.getMessage());
        } finally {
            System.out.println("Outer finally block");
        }
    }

    public static void validateAge(int age) {
        if (age < 18) {
            throw new IllegalArgumentException("Age must be 18 or older.");
        }
        System.out.println("Age is valid.");
    }

    public static void readFile(String fileName) throws FileNotFoundException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        System.out.println("File read successfully");
    }

    public static void validateCustomAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("Age must be 18 or older.");
        }
        System.out.println("Age is valid.");
    }
}

Output:

Caught ArithmeticException: / by zero
Finally block executed.
Caught IllegalArgumentException: Age must be 18 or older.
Caught FileNotFoundException: example.txt (No such file or directory)
Caught custom exception: Age must be 18 or older.
Array index out of bounds: Index 10 out of bounds for length 3
Outer try block
Inner catch: Arithmetic error: / by zero
Outer catch: Array index out of bounds: Index 10 out of bounds for length 3
Outer finally block

Explanation:

  • Example 1: Demonstrates the use of try, catch, and finally keywords to handle an ArithmeticException.
  • Example 2: Shows how to use the throw keyword to throw a built-in exception (IllegalArgumentException).
  • Example 3: Illustrates the use of the throws keyword to declare that a method can throw a FileNotFoundException.
  • Example 4: Shows how to use the throw keyword to throw a custom exception (InvalidAgeException).
  • Example 5: Demonstrates handling multiple exceptions using multiple catch blocks.
  • Example 6: Shows how to use nested try blocks to handle exceptions at different levels.

9. Conclusion

Exception handling is a crucial aspect of Java programming. Understanding and effectively using the exception handling keywords (try, catch, finally, throw, and throws) can help you write more robust and error-resistant code. By handling exceptions properly, you can ensure that your programs continue to run smoothly even when unexpected events occur.

Happy coding!

Comments