Java Exception propagation

Exception propagation is a way of propagating exceptions from method to method. Let an exception occur in a method at the top of the call stack and if it is not caught then it propagates to the previous method in the call stack, if it is not caught here then it again propagates to the previous method in the call stack and so on until either it is caught or reaches the bottom of the stack.

 

Example: Exception propagation in case of unchecked exception.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class ArithmaticTest{
public void division(int num1, int num2) {
//java.lang.ArithmeticException here
//and not caught hence propagate to method1.
System.out.println(num1/num2);
}
public void method1(int num1, int num2) {
//not caught here and hence propagate to method2.
division(num1, num2);
}
public void method2(int num1, int num2){
try{
method1(num1, num2);
}catch(Exception e){//caught exception here.
System.out.println("Exception Handled");
}
}
}
public class ExceptionPropagationExample1 {
public static void main(String args[]){
//creating ArithmaticTest object
ArithmaticTest obj = new ArithmaticTest();
//method call
obj.method2(20, 0);
}
}
class ArithmaticTest{ public void division(int num1, int num2) { //java.lang.ArithmeticException here //and not caught hence propagate to method1. System.out.println(num1/num2); } public void method1(int num1, int num2) { //not caught here and hence propagate to method2. division(num1, num2); } public void method2(int num1, int num2){ try{ method1(num1, num2); }catch(Exception e){//caught exception here. System.out.println("Exception Handled"); } } } public class ExceptionPropagationExample1 { public static void main(String args[]){ //creating ArithmaticTest object ArithmaticTest obj = new ArithmaticTest(); //method call obj.method2(20, 0); } }
class ArithmaticTest{
	
	public void division(int num1, int num2) {
		//java.lang.ArithmeticException here 
                //and not caught hence propagate to method1.
		System.out.println(num1/num2);
	}
	
	public void method1(int num1, int num2) {
		//not caught here and hence propagate to method2.
		division(num1, num2);
	}
	
	public void method2(int num1, int num2){
		try{
			method1(num1, num2);
		}catch(Exception e){//caught exception here.
			System.out.println("Exception Handled");
		}
	}
}

public class ExceptionPropagationExample1 {
	public static void main(String args[]){
		//creating ArithmaticTest object
		ArithmaticTest obj =  new ArithmaticTest();
		
		//method call
		obj.method2(20, 0);
	}
}

Output

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Exception Handled
Exception Handled
Exception Handled

 

Example: Exception propagation in case of checked exception.

Note: Checked exceptions are not propagated in exception change.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import java.io.IOException;
class Test{
public void method3() {
//compile time error here because
//checked exceptions can't be propagated.
throw new IOException();
}
public void method1(){
method3();
}
public void method2(){
try{
method1();
}catch(Exception e){
System.out.println("Exception Handled");
}
}
}
public class ExceptionPropagationExample2 {
public static void main(String args[]){
//creating Test object
Test obj = new Test();
//method call
obj.method2();
}
}
import java.io.IOException; class Test{ public void method3() { //compile time error here because //checked exceptions can't be propagated. throw new IOException(); } public void method1(){ method3(); } public void method2(){ try{ method1(); }catch(Exception e){ System.out.println("Exception Handled"); } } } public class ExceptionPropagationExample2 { public static void main(String args[]){ //creating Test object Test obj = new Test(); //method call obj.method2(); } }
import java.io.IOException;

class Test{
	
	public void method3() {
		//compile time error here because 
                //checked exceptions can't be propagated.
		throw new IOException();
	}
	
	public void method1(){
		method3();
	}
	
	public void method2(){
		try{
			method1();
		}catch(Exception e){
			System.out.println("Exception Handled");
		}
	}
}

public class ExceptionPropagationExample2 {
	public static void main(String args[]){
		//creating Test object
		Test obj =  new Test();
		
		//method call
		obj.method2();
	}
}

Output

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
Unhandled exception type IOException
at com.w3schools.business.Test.method3
(ExceptionPropagationExample2.java:13)
at com.w3schools.business.Test.method1
(ExceptionPropagationExample2.java:17)
at com.w3schools.business.Test.method2
(ExceptionPropagationExample2.java:22)
at com.w3schools.business.ExceptionPropagationExample2.main
(ExceptionPropagationExample2.java:35)
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Unhandled exception type IOException at com.w3schools.business.Test.method3 (ExceptionPropagationExample2.java:13) at com.w3schools.business.Test.method1 (ExceptionPropagationExample2.java:17) at com.w3schools.business.Test.method2 (ExceptionPropagationExample2.java:22) at com.w3schools.business.ExceptionPropagationExample2.main (ExceptionPropagationExample2.java:35)
Exception in thread "main" java.lang.Error: 
Unresolved compilation problem:
Unhandled exception type IOException
at com.w3schools.business.Test.method3
(ExceptionPropagationExample2.java:13)
at com.w3schools.business.Test.method1
(ExceptionPropagationExample2.java:17)
at com.w3schools.business.Test.method2
(ExceptionPropagationExample2.java:22)
at com.w3schools.business.ExceptionPropagationExample2.main
(ExceptionPropagationExample2.java:35)