Tutorial

Java Exception Interview Questions and Answers

Published on August 3, 2022
author

Pankaj

Java Exception Interview Questions and Answers

Java provides a robust and object-oriented approach to handle exception scenarios known as Java Exception Handling. Sometime back I wrote a long post on Exception Handling in Java and today I am listing some important Java Exceptions Questions with Answers to help you in interviews.

  1. What is an Exception in Java?
  2. What are the Exception Handling Keywords in Java?
  3. Explain Java Exception Hierarchy?
  4. What are the important methods of Java Exception Class?
  5. Explain Java 7 ARM Feature and multi-catch block?
  6. What is the difference between Checked and Unchecked Exceptions in Java?
  7. What is the difference between the throw and throws keyword in Java?
  8. How to write custom exceptions in Java?
  9. What is OutOfMemoryError in Java?
  10. What are different scenarios causing “Exception in thread main”?
  11. What is the difference between final, finally, and finalize in Java?
  12. What happens when an exception is thrown by the main method?
  13. Can we have an empty catch block?
  14. Provide some Java Exception Handling Best Practices?
  15. What is the problem with the below programs and how do we fix it?

1. What is an Exception in Java?

An exception is an error event that can happen during the execution of a program and disrupts its normal flow. The exception can arise from different kinds of situations such as wrong data entered by the user, hardware failure, network connection failure, etc. Whenever any error occurs while executing a java statement, an exception object is created, and then JRE tries to find an exception handler to handle the exception. If a suitable exception handler is found then the exception object is passed to the handler code to process the exception, known as catching the exception. If no handler is found then the application throws the exception to the runtime environment and JRE terminates the program. Java Exception handling framework is used to handle runtime errors only, compile-time errors are not handled by exception handling framework.

2. What are the Exception Handling Keywords in Java?

There are four keywords used in java exception handling.

  1. throw: Sometimes we explicitly want to create an exception object and then throw it to halt the normal processing of the program. The throw keyword is used to throw exceptions to the runtime to handle it.
  2. throws: When we are throwing any checked exception in a method and not handling it, then we need to use the throws keyword in the method signature to let the caller program know the exceptions that might be thrown by the method. The caller method might handle these exceptions or propagate them to its caller method using the throws keyword. We can provide multiple exceptions in the throws clause and it can be used with the main() method also.
  3. try-catch: We use try-catch block for exception handling in our code. try is the start of the block and catch is at the end of the try block to handle the exceptions. We can have multiple catch blocks with a try and try-catch blocks can be nested also. catch block requires a parameter that should be of type Exception.
  4. finally: The finally block is optional and can be used only with a try-catch block. Since exception halts the process of execution, we might have some resources open that will not get closed, so we can use the finally block. The finally block gets executed always, whether an exception occurs or not.

3. Explain Java Exception Hierarchy?

Java Exceptions are hierarchical and inheritance is used to categorize different types of exceptions. Throwable is the parent class of Java Exceptions Hierarchy and it has two child objects – Error and Exception. Exceptions are further divided into checked exceptions and runtime exceptions. Errors are exceptional scenarios that are out of the scope of application and it’s not possible to anticipate and recover from them, for example, hardware failure, JVM crash, or out-of-memory error. Checked Exceptions are exceptional scenarios that we can anticipate in a program and try to recover from it, for example, FileNotFoundException. We should catch this exception and provide a useful message to the user and log it properly for debugging purposes. Exception is the parent class of all Checked Exceptions. Runtime Exceptions are caused by bad programming, for example, trying to retrieve an element from the Array. We should check the length of the array first before trying to retrieve the element otherwise it might throw ArrayIndexOutOfBoundException at runtime. RuntimeException is the parent class of all runtime exceptions. exception handling in java interview questions, exception handling interview questions, java exception interview questions

4. What are the important methods of Java Exception Class?

Exception and all of its subclasses don’t provide any specific methods and all of the methods are defined in the base class Throwable.

  1. String getMessage() - This method returns the message String of Throwable and the message can be provided while creating the exception through its constructor.
  2. String getLocalizedMessage() - This method is provided so that subclasses can override it to provide the locale-specific messages to the calling program. Throwable class implementation of this method simply use getMessage() method to return the exception message.
  3. synchronized Throwable getCause() - This method returns the cause of the exception or null if the cause is unknown.
  4. String toString() - This method returns the information about Throwable in String format, the returned String contains the name of Throwable class and localized message.
  5. void printStackTrace() - This method prints the stack trace information to the standard error stream, this method is overloaded and we can pass PrintStream or PrintWriter as an argument to write the stack trace information to the file or stream.

5. Explain Java 7 ARM Feature and multi-catch block?

If you are catching a lot of exceptions in a single try block, you will notice that catch block code looks very ugly and mostly consists of redundant code to log the error, keeping this in mind Java 7 one of the features was the multi-catch block where we can catch multiple exceptions in a single catch block. The catch block with this feature looks like below:

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

Most of the time, we use finally block just to close the resources and sometimes we forget to close them and get runtime exceptions when the resources are exhausted. These exceptions are hard to debug and we might need to look into each place where we are using that type of resource to make sure we are closing it. So java 7 one of the improvements was try-with-resources where we can create a resource in the try statement itself and use it inside the try-catch block. When the execution comes out of the try-catch block, the runtime environment automatically closes these resources. Sample of try-catch block with this improvement is:

try (MyResource mr = new MyResource()) {
            System.out.println("MyResource created in try-with-resources");
        } catch (Exception e) {
            e.printStackTrace();
        }

Read more about this at Java 7 ARM.

6. What is the difference between Checked and Unchecked Exceptions in Java?

  1. Checked Exceptions should be handled in the code using try-catch block or else the method should use the throws keyword to let the caller know about the checked exceptions that might be thrown from the method. Unchecked Exceptions are not required to be handled in the program or to mention them in the throws clause of the method.
  2. Exception is the superclass of all checked exceptions whereas RuntimeException is the superclass of all unchecked exceptions. Note that RuntimeException is the child class of Exception.
  3. Checked exceptions are error scenarios that require to be handled in the code, or else you will get compile time error. For example, if you use FileReader to read a file, it throws FileNotFoundException and we must catch it in the try-catch block or throw it again to the caller method. Unchecked exceptions are mostly caused by poor programming, for example, NullPointerException when invoking a method on an object reference without making sure that it’s not null. For example, I can write a method to remove all the vowels from the string. It’s the caller’s responsibility to make sure not to pass a null string. I might change the method to handle these scenarios but ideally, the caller should take care of this.

7. What is the difference between the throw and throws keyword in Java?

throws keyword is used with method signature to declare the exceptions that the method might throw whereas throw keyword is used to disrupt the flow of the program and handing over the exception object to runtime to handle it.

8. How to write custom exceptions in Java?

We can extend Exception class or any of its subclasses to create our custom exception class. The custom exception class can have its own variables and methods that we can use to pass error codes or other exception-related information to the exception handler. A simple example of a custom exception is shown below.

package com.journaldev.exceptions;

import java.io.IOException;

public class MyException extends IOException {

	private static final long serialVersionUID = 4664456874499611218L;
	
	private String errorCode="Unknown_Exception";
	
	public MyException(String message, String errorCode){
		super(message);
		this.errorCode=errorCode;
	}
	
	public String getErrorCode(){
		return this.errorCode;
	}
	

}

9. What is OutOfMemoryError in Java?

OutOfMemoryError in Java is a subclass of java.lang.VirtualMachineError and it’s thrown by JVM when it ran out of heap memory. We can fix this error by providing more memory to run the java application through java options. $>java MyProgram -Xms1024m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=256m

10. What are different scenarios causing “Exception in thread main”?

Some of the common main thread exception scenarios are:

  • Exception in thread main java.lang.UnsupportedClassVersionError: This exception comes when your java class is compiled from another JDK version and you are trying to run it from another java version.
  • Exception in thread main java.lang.NoClassDefFoundError: There are two variants of this exception. The first one is where you provide the class full name with .class extension. The second scenario is when Class is not found.
  • Exception in thread main java.lang.NoSuchMethodError: main: This exception comes when you are trying to run a class that doesn’t have the main method.
  • Exception in thread “main” java.lang.ArithmeticException: Whenever an exception is thrown from the main method, it prints the exception in the console. The first part explains that an exception is thrown from the main method, the second part prints the exception class name and then after a colon, it prints the exception message.

Read more about these at Java Exception in thread main.

11. What is the difference between final, finally, and finalize in Java?

final and finally are keywords in java whereas finalize is a method. final keyword can be used with class variables so that they can’t be reassigned, with the class to avoid extending by classes and with methods to avoid overriding by subclasses, finally keyword is used with try-catch block to provide statements that will always get executed even if some exception arises, usually finally is used to close resources. finalize() method is executed by Garbage Collector before the object is destroyed, it’s a great way to make sure all the global resources are closed. Out of the three, only finally is related to java exception handling.

12. What happens when an exception is thrown by the main method?

When an exception is thrown by a main() method, Java Runtime terminates the program and prints the exception message and stack trace in the system console.

13. Can we have an empty catch block?

We can have an empty catch block but it’s an example of bad programming. We should never have an empty catch block because if the exception is caught by that block, we will have no information about the exception and it wil be a nightmare to debug it. There should be at least a logging statement to log the exception details in console or log files.

14. Provide some Java Exception Handling Best Practices?

Some of the best practices related to Java Exception Handling are:

  • Use Specific Exceptions for ease of debugging.
  • Throw Exceptions Early (Fail-Fast) in the program.
  • Catch Exceptions late in the program, let the caller handle the exception.
  • Use Java 7 ARM feature to make sure resources are closed or use finally block to close them properly.
  • Always log exception messages for debugging purposes.
  • Use multi-catch block for cleaner close.
  • Use custom exceptions to throw a single type of exception from your application API.
  • Follow naming convention, always end with Exception.
  • Document the Exceptions Thrown by a method using @throws in javadoc.
  • Exceptions are costly, so throw it only when it makes sense. Else you can catch them and provide a null or empty response.

Read more about them in detail at Java Exception Handling Best Practices.

15. What is the problem with the below programs and how do we fix it?

In this section, we will look into some programming questions related to java exceptions.

  1. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class TestException {
    
    	public static void main(String[] args) {
    		try {
    			testExceptions();
    		} catch (FileNotFoundException | IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	
    	
    	public static void testExceptions() throws IOException, FileNotFoundException{
    		
    	}
    }
    

    The above program won’t compile and you will get an error message as “The exception FileNotFoundException is already caught by the alternative IOException”. This is because FileNotFoundException is a subclass of IOException, there are two ways to solve this problem. The first way is to use a single catch block for both the exceptions.

    		try {
    			testExceptions();
    		}catch(FileNotFoundException e){
    			e.printStackTrace();
    		}catch (IOException  e) {
    			e.printStackTrace();
    		}
    

    Another way is to remove the FileNotFoundException from the multi-catch block.

    		try {
    			testExceptions();
    		}catch (IOException  e) {
    			e.printStackTrace();
    		}
    

    You can chose any of these approach based on your catch block code.

  2. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    import javax.xml.bind.JAXBException;
    
    public class TestException1 {
    
    	public static void main(String[] args) {
    			try {
    				go();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (JAXBException e) {
    				e.printStackTrace();
    			}
    	}
    
    	public static void go() throws IOException, JAXBException, FileNotFoundException{
    		
    	}
    }
    

    The program won’t compile because FileNotFoundException is a subclass of IOException, so the catch block of FileNotFoundException is unreachable and you will get an error message as “Unreachable catch block for FileNotFoundException. It is already handled by the catch block for IOException”. You need to fix the catch block order to solve this issue.

    			try {
    				go();
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (JAXBException e) {
    				e.printStackTrace();
    			}
    

    Notice that JAXBException is not related to IOException or FileNotFoundException and can be put anywhere in the above catch block hierarchy.

  3. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    import java.io.IOException;
    
    import javax.xml.bind.JAXBException;
    
    public class TestException2 {
    
    	public static void main(String[] args) {
    		try {
    			foo();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}catch(JAXBException e){
    			e.printStackTrace();
    		}catch(NullPointerException e){
    			e.printStackTrace();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    
    	public static void foo() throws IOException{
    		
    	}
    }
    

    The program won’t compile because JAXBException is a checked exception and foo() method should throw this exception to catch in the calling method. You will get an error message as “Unreachable catch block for JAXBException. This exception is never thrown from the try statement body”. To solve this issue, you will have to remove the catch block of JAXBException. Notice that catching NullPointerException is valid because it’s an unchecked exception.

  4. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    public class TestException3 {
    
    	public static void main(String[] args) {
    		try{
    		bar();
    		}catch(NullPointerException e){
    			e.printStackTrace();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		
    		foo();
    	}
    
    	public static void bar(){
    		
    	}
    	
    	public static void foo() throws NullPointerException{
    		
    	}
    }
    

    This is a trick question, there is no problem with the code and it will compile successfully. We can always catch an Exception or any unchecked exception even if it’s not in the throws clause of the method. Similarly, if a method (foo) declares an unchecked exception in the throws clause, it is not mandatory to handle that in the program.

  5. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    import java.io.IOException;
    
    public class TestException4 {
    
    	public void start() throws IOException{		
    	}
    	
    	public void foo() throws NullPointerException{
    		
    	}
    }
    
    class TestException5 extends TestException4{
    	
    	public void start() throws Exception{
    	}
    	
    	public void foo() throws RuntimeException{
    		
    	}
    }
    

    The above program won’t compile because the start() method signature is not the same in the subclass. To fix this issue, we can either change the method singnature in the subclass to be exactly the same as the superclass or we can remove the throws clause from the subclass method as shown below.

    @Override
    	public void start(){
    	}
    
  6. What is the problem with the below program?

    package com.journaldev.exceptions;
    
    import java.io.IOException;
    
    import javax.xml.bind.JAXBException;
    
    public class TestException6 {
    
    	public static void main(String[] args) {
    		try {
    			foo();
    		} catch (IOException | JAXBException e) {
    			e = new Exception("");
    			e.printStackTrace();
    		}catch(Exception e){
    			e = new Exception("");
    			e.printStackTrace();
    		}
    	}
    
    	public static void foo() throws IOException, JAXBException{
    		
    	}
    }
    

    The above program won’t compile because the exception object in the multi-catch block is final and we can’t change its value. You will get compile time error as “The parameter e of a multi-catch block cannot be assigned”. We have to remove the assignment of “e” to a new exception object to solve this error. Read more at Java 7 multi-catch block.

Thats all for the java exception interview questions, I hope you will like them. I will be adding more to the list in the future, make sure you bookmark it for future use.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Pankaj

author

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
February 4, 2021

Thank You for the post pankaj, could you please update the indentation/numbering. Thank You.

- raja

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    August 9, 2020

    May i know all these questions are enough for Interview

    - Jai Kumar

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      July 31, 2019

      Hi Sir, Thanks for advance, This is your statement, Java Exception handling framework is used to handle runtime errors only, compile time errors are not handled by exception handling framework. Could you please share me who will handle this compile time errors(compiletime exceptions).

      - Ram

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        July 14, 2019

        consider following code snipped try{ int a = 10/0; // statement 1 }catch(ArithmeticException ae){ // handle code } My question is – exception arise at statement 1 & Exception object created,but how java internally identify that exception is ArithmeticException only, not other one ?

        - Chetan

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          February 25, 2019

          Good set of questions Pankaj. Thanks for the effort you put in.

          - Murali P

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            September 17, 2018

            HI Pankaj, Thanks for providing this very useful tutorial, i learned a lot from it. It is mentioned that catching “NullpointerException” is perfectly fine. But i think it’s a bad practice to catch such Runtime Exceptions, they should be avoided with proper programming logics rather catching. what do you think? Thanks, -Dash

            - Dash

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              September 10, 2018

              Hi All, Question 5 ; One overriding rule w.r.t exception: If child class method throws any checked exception compulsory parent class method should throw the same checked exception or its parent. It needs not to exact same. But there are no restrictions for unchecked exceptions. The code will be fine like below… package com.journaldev.exceptions; import java.io.IOException; public class TestException4 { public void start() throws Exception{ } public void foo() throws NullPointerException{ } } class TestException5 extends TestException4{ public void start() throws IOException{ } public void foo() throws RuntimeException{ } } Thanks, Murali

              - Murali Tekumatla

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                August 12, 2018

                Please explain 5 question

                - Shreya

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  August 1, 2018

                  Hi, First sample code in section 5 looked incorrect to me (catch(IOException | SQLException | Exception ex)). Types in multi-catch block must be disjoint. IO and SQL exceptions are subclasses of Exception in this case!

                  - Ozzybil

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    May 15, 2018

                    Beautiful tutorials.We love to study java from this tutorials all time!! Keep it Up!!

                    - Jitendra Singh

                      Try DigitalOcean for free

                      Click below to sign up and get $200 of credit to try our products over 60 days!

                      Sign up

                      Join the Tech Talk
                      Success! Thank you! Please check your email for further details.

                      Please complete your information!

                      Become a contributor for community

                      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                      DigitalOcean Documentation

                      Full documentation for every DigitalOcean product.

                      Resources for startups and SMBs

                      The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                      Get our newsletter

                      Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                      New accounts only. By submitting your email you agree to our Privacy Policy

                      The developer cloud

                      Scale up as you grow — whether you're running one virtual machine or ten thousand.

                      Get started for free

                      Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                      *This promotional offer applies to new accounts only.