 
Exception Handling with Method Overriding:
Ambiguity arises when method overriding and exception handling are combined. Which definition should be followed confuses the compiler.
Problem categories:
It has two different kinds of issues, which are as follows:
- Problem 1: If The SuperClass doesn’t declare an exception
- Problem 2: If The SuperClass declares an exception
If The SuperClass does not declare an exception:
Two scenarios that will occur in this issue are as follows:
- Case 1: If a subclass declares a checked exception and the superclass doesn’t
- Case 2: In the event that SuperClass doesn’t declare any exceptions and SubClass does
Let’s talk about the two cases mentioned above and interpret them using the following examples:
Case 1: If the SuperClass doesn’t declare any exceptions and the checked exceptions are declared by the subclass.
Example:
import java.io.*;
class SuperClass {
// SuperClass doesn't declare any exception
void method() {
	System.out.println("SuperClass");
}
}
// SuperClass inherited by the SubClass
class SubClass extends SuperClass {
// method() declaring Checked Exception IOException
void method() throws IOException {
	// IOException is of type Checked Exception
	// so the compiler will give Error
	System.out.println("SubClass");
}
// Driver code
public static void main(String args[]) {
	SuperClass s = new SubClass();
	s.method();
}
}
Output:
void method() throws IOException {
     ^
  overridden method does not throw IOException
1 error
Case 2: In the event that SuperClass doesn’t declare any exceptions and SubClass does
Example:
import java.io.*;
class SuperClass {
	// SuperClass doesn't declare any exception
	void method()
	{
		System.out.println("SuperClass");
	}
}
// SuperClass inherited by the SubClass
class SubClass extends SuperClass {
	// method() declaring Unchecked Exception ArithmeticException
	void method() throws ArithmeticException
	{
		// ArithmeticException is of type Unchecked Exception
		// so the compiler won't give any error
		System.out.println("SubClass");
	}
	// Driver code
	public static void main(String args[])
	{
		SuperClass s = new SubClass();
		s.method();
	}
}
Output:
SubClassNow let’s focus on the subsequent issue that arises from that, which occurs if The SuperClass declares an exception. Three cases will present themselves in this issue:
- Case 1: When a SuperClass declares an exception and a SubClass declares an exception that is not the SuperClass’s declared exception’s child exception.
- Case 2: When a child exception of a SuperClass declared exception is declared by a SubClass.
- Case 3: When a SuperClass declares an exception but a SubClass does not.
Example for Case 1:
import java.io.*;
class SuperClass {
// SuperClass declares an exception
void method() throws RuntimeException {
	System.out.println("SuperClass");
}
}
// SuperClass inherited by the SubClass
class SubClass extends SuperClass {
// SubClass declaring an exception
// which are not a child exception of RuntimeException
void method() throws Exception {
	// Exception is not a child exception
	// of the RuntimeException
	// So the compiler will give an error
	System.out.println("SubClass");
}
// Driver code
public static void main(String args[]) {
	SuperClass s = new SubClass();
	s.method();
}
}
Output:
void method() throws Exception {
     ^
  overridden method does not throw Exception
1 error
Example for Case 2:
import java.io.*;
class SuperClass {
	// SuperClass declares an exception
	void method() throws RuntimeException
	{
		System.out.println("SuperClass");
	}
}
// SuperClass inherited by the SubClass
class SubClass extends SuperClass {
	// SubClass declaring a child exception
	// of RuntimeException
	void method() throws ArithmeticException
	{
		// ArithmeticException is a child exception
		// of the RuntimeException
		// So the compiler won't give an error
		System.out.println("SubClass");
	}
	// Driver code
	public static void main(String args[])
	{
		SuperClass s = new SubClass();
		s.method();
	}
}
Output:
SubClassExample for Case 3:
import java.io.*;
class SuperClass {
	// SuperClass declares an exception
	void method() throws IOException
	{
		System.out.println("SuperClass");
	}
}
// SuperClass inherited by the SubClass
class SubClass extends SuperClass {
	// SubClass declaring without exception
	void method()
	{
		System.out.println("SubClass");
	}
	// Driver code
	public static void main(String args[])
	{
		SuperClass s = new SubClass();
	try {
		s.method();
	} catch (IOException e) {
		e.printStackTrace();
	}
	}
}
Output:
SubClassNote: also read about the Interface vs Abstract class
Follow Me
If you like my post, please follow me to read my latest post on programming and technology.
https://www.instagram.com/coderz.py/
https://www.facebook.com/coderz.py
Staying up to the mark is what defines me. Hi all! I’m Rabecca Fatima a keen learner, great enthusiast, ready to take new challenges as stepping stones towards flying colors.
Leave a Comment
You must be logged in to post a comment.