Java.Core.Describe the hierarchy of exceptions

Java provides a structured exception handling mechanism based on an inheritance hierarchy. At the top, all exceptions and errors are subclasses of Throwable, which is further divided into Exception and Error.

Top-Level Hierarchy

java.lang.Throwable
├── java.lang.Exception
│   ├── java.lang.RuntimeException
│   │   ├── ArithmeticException
│   │   ├── NullPointerException
│   │   ├── ArrayIndexOutOfBoundsException
│   │   ├── ClassCastException
│   │   ├── IllegalArgumentException
│   │   ├── NumberFormatException
│   │   └── ...
│   ├── IOException
│   │   ├── FileNotFoundException
│   │   ├── EOFException
│   │   └── ...
│   ├── SQLException
│   ├── InterruptedException
│   └── ...
│
└── java.lang.Error
    ├── StackOverflowError
    ├── OutOfMemoryError
    ├── VirtualMachineError
    ├── AssertionError
    ├── ...

2. Breakdown of Throwable

2.1 Throwable (Root Class)

  • The root class for all exceptions and errors in Java.
  • Every exception or error inherits from Throwable.

3. Exception (Recoverable Exceptions)

  • Represents conditions that a program should catch and handle.
  • It is further divided into:
    • Checked Exceptions (must be handled using try-catch or declared using throws).
    • Unchecked Exceptions (Runtime exceptions, which can be avoided with proper coding).

3.1 Checked Exceptions (Compile-Time Exceptions)

  • Must be either caught using try-catch or declared in the method signature using throws.
  • The compiler forces handling of these exceptions.
  • Common checked exceptions:
    • IOException (when file operations fail)
    • SQLException (when database access fails)
    • InterruptedException (when a thread is interrupted)
    • ClassNotFoundException (when a class is not found at runtime)

Example: Checked Exception Handling

import java.io.*;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            FileReader file = new FileReader("test.txt"); // May throw FileNotFoundException
        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + e.getMessage());
        }
    }
}

3.2 Unchecked Exceptions (Runtime Exceptions)

  • Occur during program execution (runtime).
  • They are subclasses of RuntimeException.
  • Do not require try-catch but should be prevented with better coding practices.
  • Common unchecked exceptions:
    • NullPointerException (accessing a null object)
    • ArrayIndexOutOfBoundsException (accessing invalid array index)
    • ArithmeticException (division by zero)
    • ClassCastException (invalid type conversion)
    • IllegalArgumentException (wrong arguments in a method)

Example: Unchecked Exception (Avoiding NullPointerException)

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String str = null;
        // System.out.println(str.length()); // This will throw NullPointerException
        
        if (str != null) {
            System.out.println(str.length()); // Safe approach
        } else {
            System.out.println("String is null");
        }
    }
}

4. Error (Non-Recoverable)

  • Represents serious problems that a program should not handle.
  • Errors usually indicate issues with the JVM, memory, or system resources.
  • Common errors:
    • StackOverflowError (infinite recursion)
    • OutOfMemoryError (insufficient heap memory)
    • VirtualMachineError (JVM failure)
    • AssertionError (failed assertion checks)

Example: StackOverflowError

public class StackOverflowExample {
    public static void recursiveMethod() {
        recursiveMethod(); // Infinite recursion
    }

    public static void main(String[] args) {
        recursiveMethod(); // This will cause StackOverflowError
    }
}

Output:

Exception in thread "main" java.lang.StackOverflowError

5. Summary Table

Exception TypeDescriptionHandling Required?Examples
Checked ExceptionCompile-time exceptions✅ YesIOException, SQLException, InterruptedException
Unchecked ExceptionRuntime exceptions❌ NoNullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException
ErrorSerious system-level errors🚫 NoStackOverflowError, OutOfMemoryError

6. Custom Exceptions

You can create custom exceptions by extending Exception (checked) or RuntimeException (unchecked).

Example: Custom Exception

class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            throw new CustomException("This is a custom exception");
        } catch (CustomException e) {
            System.out.println("Caught: " + e.getMessage());
        }
    }
}

7. Best Practices for Exception Handling

Use checked exceptions for recoverable conditions, situations not depending on programmer.
Use unchecked exceptions for programming mistakes (e.g., null access), depends on programmer and should be fixed;
Catch specific exceptions instead of Exception or Throwable.
Use finally or try-with-resources to close resources.
Avoid suppressing exceptions with empty catch blocks.
Use meaningful exception messages to ease debugging.

This entry was posted in Без рубрики. Bookmark the permalink.