Java.Core

1. Steps to Create a Custom Exception

  1. Create a new class that extends either Exception (for checked exceptions) or RuntimeException (for unchecked exceptions).
  2. Provide a constructor to initialize the exception message.
  3. (Optional) Override methods or add additional functionality.

2. Checked vs. Unchecked Custom Exceptions

TypeExtendHandling Required?When to Use
Checked ExceptionException✅ Must handle (try-catch or throws)External failures (I/O, DB)
Unchecked ExceptionRuntimeException❌ Not requiredProgramming logic errors

3. Creating a Checked Exception (Extending Exception)

Use case: If an invalid age is provided, throw InvalidAgeException.

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

public class CheckedExceptionExample {
    // Method that throws our custom checked exception
    public static void checkAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("Age must be 18 or older.");
        }
    }

    public static void main(String[] args) {
        try {
            checkAge(16);
        } catch (InvalidAgeException e) {
            System.out.println("Caught Exception: " + e.getMessage());
        }
    }
}

Output:

Caught Exception: Age must be 18 or older.

📌 Why extend Exception?

  • Forces the caller to handle or declare the exception using try-catch or throws.

4. Creating an Unchecked Exception (Extending RuntimeException)

Use case: If a number is negative, throw NegativeNumberException.

// Custom Unchecked Exception
class NegativeNumberException extends RuntimeException {
    public NegativeNumberException(String message) {
        super(message);
    }
}

public class UncheckedExceptionExample {
    // Method that throws our custom unchecked exception
    public static void validateNumber(int num) {
        if (num < 0) {
            throw new NegativeNumberException("Number cannot be negative.");
        }
    }

    public static void main(String[] args) {
        validateNumber(-5); // No try-catch required, but program will crash if not handled
    }
}

🛑 Output (Uncaught Exception):

Exception in thread "main" NegativeNumberException: Number cannot be negative.

📌 Why extend RuntimeException?

  • No need for throws or forced try-catch.
  • Useful for developer mistakes (e.g., invalid method arguments).

5. Custom Exception with Additional Fields

You can add extra fields like an error code for more information.

class CustomExceptionWithCode extends Exception {
    private int errorCode;

    public CustomExceptionWithCode(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
}

public class ExceptionWithCodeExample {
    public static void checkValue(int value) throws CustomExceptionWithCode {
        if (value < 0) {
            throw new CustomExceptionWithCode("Negative values not allowed!", 1001);
        }
    }

    public static void main(String[] args) {
        try {
            checkValue(-10);
        } catch (CustomExceptionWithCode e) {
            System.out.println("Error Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
        }
    }
}

Output:

Error Code: 1001, Message: Negative values not allowed!

6. Best Practices for Custom Exceptions

Use checked exceptions for recoverable situations (e.g., invalid input, business rules).
Use unchecked exceptions for developer errors (e.g., null values, invalid method calls).
Provide meaningful exception messages for easier debugging.
Avoid overusing custom exceptions—use built-in Java exceptions when possible.

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