I have a problem when compiling my code, I'm trying to make a method of a class throw an personalized exception, given some conditions. But at the time of compiling I get the message:
Overridden method does not throw exception
Here's the class and exception declaration:
public class UNGraph implements Graph
Graph
is an interface with all the methods of UNGraph
in it (the method getId()
doesn't have the throws
declaration on that script)
After the constructor I create the exception (inside the class UNGraph):
public class NoSuchElementException extends Exception {
public NoSuchElementException(String message){
super(message);
}
}
Here is the method with the exception
public int getId(....) throws NoSuchElementException {
if (condition is met) {
//Do method
return variable;
}
else{
throw new NoSuchElementException (message);
}
}
Obviously I don't want the method to throw an exception every time, just when the condition is not met; and when it's met, I want to return a variable.
An overriding method can throw any unchecked exceptions, regardless of whether the overridden method throws exceptions or not. However, the overriding method should not throw checked exceptions that are new or broader than the ones declared by the overridden method.
According to the 3rd rule, if the super-class method throws certain exception, you can override it without throwing any exception.
Instance Methods The ability of a subclass to override a method allows a class to inherit from a superclass whose behavior is "close enough" and then to modify behavior as needed. The overriding method has the same name, number and type of parameters, and return type as the method that it overrides.
We need to follow some rules when we overriding a method that throws an Exception. When the parent class method doesn't throw any exceptions, the child class method can't throw any checked exception, but it may throw any unchecked exceptions.
The compiler is issuing an error because Java does not allow you to override a method and add a checked Exception (any user-defined custom exception that extends the Exception
class). Because it is clear that you want to handle the scenario where some condition is not met as an unexpected occurrence (a bug), your best option is to throw a RuntimeException
. A RuntimeException
, such as: IllegalArgumentException
or NullPointerException
, does not have to be included in a method signature, so you will alleviate your compiler error.
I suggest the following changes to your code:
//First: Change the base class exception to RuntimeException:
public class NoSuchElementException extends RuntimeException {
public NoSuchElementException(String message){
super(message);
}
}
//Second: Remove the exception clause of the getId signature
//(and remove the unnecessary else structure):
public int getId(....) {
if ( condition is met) { return variable; }
//Exception will only be thrown if condition is not met:
throw new NoSuchElementException (message);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With