Creating custom exception class in Java - Performance & Efficiency
Start learning this pattern below
Jump into concepts and practice - no test required
When creating a custom exception class in Java, it's important to understand how the time cost grows when throwing or handling exceptions.
We want to see how the program's running time changes as exceptions are created or thrown.
Analyze the time complexity of the following code snippet.
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public void checkValue(int value) throws MyException {
if (value < 0) {
throw new MyException("Negative value not allowed");
}
}
This code defines a custom exception and throws it when a value is negative.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating and throwing the custom exception object.
- How many times: Each time the method is called with a negative value, the exception is created and thrown once.
Each call to checkValue either throws an exception or not, so the time depends on how many calls happen and how many throw exceptions.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 10 exception creations if all values are negative |
| 100 | Up to 100 exception creations if all values are negative |
| 1000 | Up to 1000 exception creations if all values are negative |
Pattern observation: The time grows linearly with the number of exceptions created and thrown.
Time Complexity: O(n)
This means the time grows in a straight line with the number of times the exception is thrown.
[X] Wrong: "Creating a custom exception class makes the program slower for all code, even when exceptions are not thrown."
[OK] Correct: Defining the class itself does not slow down normal code; only throwing exceptions takes extra time.
Understanding how exceptions affect time helps you write better error handling and shows you know how code performance changes in real situations.
"What if we changed the exception to be thrown inside a loop that runs n times? How would the time complexity change?"
Practice
Solution
Step 1: Understand Java exception hierarchy
Custom exceptions must extend eitherExceptionorRuntimeExceptionto behave like exceptions.Step 2: Recognize correct inheritance
Implementing an interface or naming a classExceptiondoes not create a proper exception class.Final Answer:
Extend the Exception or RuntimeException class -> Option AQuick Check:
Custom exception = extends Exception [OK]
- Trying to implement Exception as an interface
- Naming class Exception instead of extending it
- Using throw keyword in class declaration
MyException?Solution
Step 1: Identify correct constructor syntax
Constructors have no return type and callsuper(message)to pass the message to the parent Exception class.Step 2: Check each option
public MyException(String message) { super(message); } correctly defines a constructor callingsuper(message). public MyException() { this.message = message; } incorrectly assigns message without declaration. public void MyException(String message) { super(message); } has a void return type, so it's not a constructor. public MyException(String message) { print(message); } calls a non-existent methodprint.Final Answer:
public MyException(String message) { super(message); } -> Option CQuick Check:
Constructor calls super(message) = public MyException(String message) { super(message); } [OK]
- Adding void return type to constructor
- Not calling super(message) in constructor
- Trying to assign message directly without declaration
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public class Test {
public static void main(String[] args) {
try {
throw new MyException("Error occurred");
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
}Solution
Step 1: Understand exception throwing and catching
The code throws aMyExceptionwith message "Error occurred" and catches it immediately.Step 2: Check output from getMessage()
The catch block printse.getMessage(), which returns the message passed to the exception.Final Answer:
Error occurred -> Option AQuick Check:
Exception message printed = Error occurred [OK]
- Expecting class name instead of message
- Thinking code won't compile due to custom exception
- Missing try-catch block causing runtime error
public class MyException extends Exception {
public void MyException(String message) {
super(message);
}
}Solution
Step 1: Check constructor syntax
Constructors must not have a return type. Here,voidmakes it a method, not a constructor.Step 2: Understand consequences
Without a proper constructor, the class uses default constructor which does not callsuper(message), causing errors when throwing with message.Final Answer:
Constructor has a void return type, so it's a method, not a constructor -> Option DQuick Check:
Constructor no return type = Constructor has a void return type, so it's a method, not a constructor [OK]
- Adding void return type to constructor
- Assuming import Exception is needed
- Thinking super() cannot be called in subclass
InvalidDataException. Which is the correct way to define it?Solution
Step 1: Understand checked vs unchecked exceptions
Unchecked exceptions extendRuntimeException, checked exceptions extendException.Step 2: Analyze each option
public class InvalidDataException extends RuntimeException { public InvalidDataException(String message) { super(message); } } correctly extendsRuntimeExceptionwith proper constructor. public class InvalidDataException extends Exception { public InvalidDataException(String message) { super(message); } } creates a checked exception. public class InvalidDataException implements RuntimeException { public InvalidDataException(String message) { super(message); } } tries to implement an exception class, which is invalid. public class InvalidDataException extends Throwable { public InvalidDataException(String message) { super(message); } } extendsThrowabledirectly, which is not recommended for custom exceptions.Final Answer:
public class InvalidDataException extends RuntimeException { public InvalidDataException(String message) { super(message); } } -> Option BQuick Check:
Unchecked exception = extends RuntimeException [OK]
- Extending Exception for unchecked exceptions
- Trying to implement exception classes
- Extending Throwable directly
