java lang Throwable Class in Java

Introduction

The Throwable class in Java is the superclass of all errors and exceptions in the Java language. Only instances of this class (or one of its subclasses) can be thrown by the Java Virtual Machine or by the throw statement. Similarly, only this class or one of its subclasses can be the argument type in a catch clause. The Throwable class provides methods for capturing information about the exception, such as its stack trace, message, and cause.

Table of Contents

  1. Overview of Throwable
  2. Hierarchy of Throwable
  3. Common Methods in Throwable
  4. Creating Custom Exceptions
  5. Complete Example Program
  6. Conclusion

1. Overview of Throwable

The Throwable class is part of the java.lang package and serves as the root class for all exceptions and errors. It has two primary direct subclasses:

  • Exception
  • Error

Syntax:

public class Throwable extends Object implements Serializable

2. Hierarchy of Throwable

The Throwable class has two main branches:

  1. Error: Represents serious problems that a reasonable application should not try to catch. Examples include OutOfMemoryError, StackOverflowError, and VirtualMachineError.
  2. Exception: Represents conditions that a reasonable application might want to catch. Examples include IOException, SQLException, and RuntimeException.

Diagram:

java.lang.Object
   └── java.lang.Throwable
          ├── java.lang.Error
          └── java.lang.Exception
               └── java.lang.RuntimeException

3. Common Methods in Throwable

The Throwable class provides several methods to retrieve information about the exception or error.

Common Methods:

  • String getMessage(): Returns the detail message string of this throwable.
  • Throwable getCause(): Returns the cause of this throwable or null if the cause is nonexistent or unknown.
  • Throwable initCause(Throwable cause): Initializes the cause of this throwable.
  • String toString(): Returns a short description of this throwable.
  • void printStackTrace(): Prints the throwable and its backtrace to the standard error stream.
  • StackTraceElement[] getStackTrace(): Provides programmatic access to the stack trace information.
  • void setStackTrace(StackTraceElement[] stackTrace): Sets the stack trace elements that will be returned by getStackTrace().

Example Usage:

public class ThrowableExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;
        } catch (ArithmeticException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("Cause: " + e.getCause());
            e.printStackTrace();
        }
    }
}

Output:

Message: / by zero
Cause: null
java.lang.ArithmeticException: / by zero
    at ThrowableExample.main(ThrowableExample.java:6)

4. Creating Custom Exceptions

You can create your own exceptions by extending the Exception class or any of its subclasses.

Example:

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

    public MyCustomException(String message, Throwable cause) {
        super(message, cause);
    }
}

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

Output:

Caught custom exception: This is a custom exception

5. Complete Example Program

Here is a complete example demonstrating the usage of Throwable and custom exceptions in Java.

Example Code:

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

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

    public MyCustomException(String message, Throwable cause) {
        super(message, cause);
    }
}

public class ThrowableExample {
    public static void main(String[] args) {
        try {
            readFile("nonexistentfile.txt");
        } catch (MyCustomException e) {
            System.out.println("Caught custom exception: " + e.getMessage());
            System.out.println("Cause: " + e.getCause());
            e.printStackTrace();
        }
    }

    public static void readFile(String fileName) throws MyCustomException {
        try {
            File file = new File(fileName);
            FileReader fr = new FileReader(file);
        } catch (FileNotFoundException e) {
            throw new MyCustomException("File not found: " + fileName, e);
        }
    }
}

Output:

Caught custom exception: File not found: nonexistentfile.txt
Cause: java.io.FileNotFoundException: nonexistentfile.txt (No such file or directory)
java.lang.MyCustomException: File not found: nonexistentfile.txt
    at ThrowableExample.readFile(ThrowableExample.java:24)
    at ThrowableExample.main(ThrowableExample.java:14)
Caused by: java.io.FileNotFoundException: nonexistentfile.txt (No such file or directory)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileReader.<init>(FileReader.java:75)
    at ThrowableExample.readFile(ThrowableExample.java:22)
    ... 1 more

Explanation:

  • The readFile method attempts to open a file. If the file is not found, it throws a custom exception MyCustomException with a cause.
  • The main method catches this custom exception and prints its message and stack trace.

6. Conclusion

The Throwable class in Java is the root class for all exceptions and errors. Understanding its hierarchy and methods is essential for effective error handling in Java. By leveraging the Throwable class and its methods, you can capture detailed information about exceptions and create custom exceptions for specific scenarios, making your code more robust and maintainable.

Happy coding!

Comments