Java Catch Multiple Exceptions, Rethrow Exception

Filed Under: Java

In Java 7, catch block has been improved to handle multiple exceptions in a single catch block. If you are catching multiple exceptions and they have similar code, then using this feature will reduce code duplication. Let’s understand java catch multiple exceptions feature with an example.

Java catch multiple exceptions

java catch multiple exceptions, java rethrow exceptions

Before Java 7, we used to catch multiple exceptions one by one as shown below.


catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

In Java 7, we can catch both these exceptions in a single catch block as:


catch(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

If a catch block handles multiple exceptions, you can separate them using a pipe (|) and in this case, exception parameter (ex) is final, so you can’t change it. The byte code generated by this feature is smaller and reduce code redundancy.

Java rethrow exception

Another improvement is done in Compiler analysis of rethrown exceptions. Java rethrow exception allows you to specify more specific exception types in the throws clause of a method declaration.

Let’s see this with a small example:


package com.journaldev.util;

public class Java7MultipleExceptions {

	public static void main(String[] args) {
		try{
			rethrow("abc");
		}catch(FirstException | SecondException | ThirdException e){
			//below assignment will throw compile time exception since e is final
			//e = new Exception();
			System.out.println(e.getMessage());
		}
	}

	static void rethrow(String s) throws FirstException, SecondException,
			ThirdException {
		try {
			if (s.equals("First"))
				throw new FirstException("First");
			else if (s.equals("Second"))
				throw new SecondException("Second");
			else
				throw new ThirdException("Third");
		} catch (Exception e) {
			//below assignment disables the improved rethrow exception type checking feature of Java 7
			// e=new ThirdException();
			throw e;
		}
	}

	static class FirstException extends Exception {

		public FirstException(String msg) {
			super(msg);
		}
	}

	static class SecondException extends Exception {

		public SecondException(String msg) {
			super(msg);
		}
	}

	static class ThirdException extends Exception {

		public ThirdException(String msg) {
			super(msg);
		}
	}

}

As you can see that in rethrow method, catch block is catching Exception but it’s not part of throws clause. Java 7 compiler analyze the complete try block to check what types of exceptions are thrown and then rethrown from the catch block.

Note that this analysis is disabled if you change the catch block argument.

Further Reading: Exception Handling in Java.

Comments

  1. Coder says:

    In Java 8 exception parameter can be changed in multi catch block?

  2. siddharth says:

    Write a program which takes the age of 5 persons from command line and find
    the average age of all persons. The program should handle exception if the
    argument is not correctly formatted and custom exception if the age is not
    between 1 to 100.

  3. Dileep says:

    what is the use again we have to re catch exceptions from where we called the method

  4. Tanu says:

    Hi Pankaj,

    Note to add here if there is hierarchy of exceptions in catch block then we need to catch base exception only, can’t write child and parent exception in same catch with pipe, it will give compilation error.

    e.g.
    catch (IOException | Exception e){}

    will say IOException already caught by the alternative Exception.

  5. phintsho says:

    hellow pankaj ,
    can u please explain more abt overloading and overriding… because i always use to get confuse between these two

  6. phintsho says:

    i dont understand the throws exception so please pankaj can u explain …..

  7. indra says:

    Hi pankaj,
    i really dont understand the code for rethrowing an exception in java7.could you please explain the code in detail.

  8. Ashok says:

    Hi Pankaj,

    if i want to throw different exception message based on exception catched then how to do that?
    ex: if sql exception then i want send message as failed to insert into table
    and number excpetion then input provided is not a valid number

    then how to use single catch block?

    1. Pankaj says:

      If you have different logic for different catch blocks, then it doesn’t make much sense to have them in a single catch block.

    2. Vivek says:

      Hi

      You can retrieve the exception object inside catch block and based upon the type of that exception you can print the exception message.

  9. subrat panda says:

    Hi Pankaj,
    Using single catch block how can I differentiate from where my code is getting exception?

    try{}
    catch(IOException ie){
    ie.printStackTrace();}
    catch(SQLException se){
    se.printStackTrace();}
    catch(Exception e){
    e.printStackTrace();}

    now it is replaced with

    catch(IOException| SQLException |Exception e){

    e.printStackTrace();}

    In the above code my doubt is e.printStackTrace() will print which exception class message whether (IOException / SQLException/Exception )?

    1. Pankaj says:

      Exception stack trace provide very detailed message for the type of exception, methods invocation hierarchy and even the line number that caused the exception.

    2. Ram says:

      We can get the class name by writing the statement below inside the catch block.
      ex.getClass().getCannonicalName();//this gives us the exact class name of the exception. It’s short to identify the exact exception class type.

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages