In this article, we will discuss throws keyword or throws clause in detail with example
1. try-catch block:
Whenever a program might raise exception, then it must be handled. In all earlier articles, we handled exception using try-catch block. For example,
- try-catch block example
- finally block example
- nested try-catch block example
- returning value from method containing try-catch—finally blocks
- return statement from finally block
- throw keyword in Java with different cases & its examples
But try-catch block isn’t only option to handle exception; let us remove try-catch block from one of the examples that we already discussed and see what exactly compiler has to say
From above screen capture, it is clear that whenever a program might raise/throw exception, then are there are 2 options to handle that exception
- surrounding with try-catch block (Surrounding with try/catch)
- using throws clause (Add throws declaration)
Note: compiler force the programmer to handle only checked exception
2. throws keyword or throws clause:
- throws keyword is used to declare exception that might raise during program execution
- whenever exception might thrown from program, then programmer doesn’t necessarily need to handle that exception using try-catch block instead simply declare that exception using throws clause next to method signature
- But this forces/tells caller-method to handle that exception; but again caller can handle that exception using try-catch block or re-declare those exception with throws clause/keyword
- In other words it can also be stated that, it provides information to caller-method, that possible exception might raise during program execution and it need to be handled
- Note: use of throws clause doesn’t necessarily mean that program will terminate normally rather it is the information to the caller to handle for normal termination
- Any number of exceptions can be specified using throws clause, but they are all need to be separated by comma (,)
- throws clause is applicable to methods & constructor but strictly not applicable to classes
- Compiler forces programmer to handle only checked exception; so it can be handled either-way using throws clause or try-catch block
- For unchecked exception, it is programmer choice; as unchecked exception by default propagated back to the caller method when it isn’t handled
- In addition to checked & unchecked exception, user-defined exception or custom exception can also be specified using throws clause
- But user-defined exception or custom exception must be of type Throwable class or one of its sub-class (i.e.; extend either Throwable class or any one of its sub-class like Exception, IOException, RuntimeException, Error, etc)
- Otherwise, compile-time error will be thrown stating “incompatible type”
Syntax of throws clause:
public static void printFileContent() throws FileNotFoundException;
We will cover various cases for throws clause, like
- Handling checked exception using try-catch block by caller-method
- Re-declaring checked exception using throws clause by caller-method
- Default exception propagation for unchecked exception
- Any number of exceptions can be declared using throws clause
- Constructor can also declare exception using throws clause
2.1 Caller method handling checked exception using try-catch block, when it encounters throws clause in the target method
CallerHandlingExceptionUsingTryCatchBlock.java
package in.bench.resources.exception.handling;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class CallerHandlingExceptionUsingTryCatchBlock {
public static void main(String[] args) {
// invoking method
try {
printFileContent();
}
catch (FileNotFoundException fnfex) {
System.out.println("Exception handled ... \n" +
fnfex.getMessage());
}
}
// throws clause for checked exception
public static void printFileContent()
throws FileNotFoundException {
// assumed that,
// we are trying to access file from remote location
FileReader fileReader = new FileReader(
"D:/Folder/test.txt");
// reading & processing file
}
}
Output:
Exception handled ...
D:\Folder\test.txt (The system cannot find the path specified)
2.2 Caller method re-declare checked exceptions using throws clause, when it encounters throws clause in the target method
CallerHandlingExceptionUsingThrowsClause.java
package in.bench.resources.exception.handling;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class CallerHandlingExceptionUsingThrowsClause {
public static void main(String[] args) throws FileNotFoundException {
// invoking method
printFileContent();
System.out.println("Successful : reading and processing completed !!");
}
// throws clause for checked exception
public static void printFileContent() throws FileNotFoundException {
// assumed that, we are trying to access file from remote location
FileReader fileReader = new FileReader("test.txt");
// reading and processing file
}
}
Output:
Successful : reading and processing completed !!
Explanation:
- If the specified path isn’t available at runtime during program execution then invoking method with “throws FileNotFoundException” result in raising exception which is propagated to caller-method i.e.; main() method
- main() method also doesn’t handle exception rather it is re-declared, and
- therefore program terminates abnormally
- finally prints stack trace in the console
2.3 Default exception propagation for unchecked exception
ThrowsKeywordWithUncheckedException.java
package in.bench.resources.exception.handling;
public class ThrowsKeywordWithUncheckedException {
public static void main(String[] args) {
// invoking method
anotherMethod(null);
}
public static void anotherMethod(String str) {
if(str == null){
throw new NullPointerException(
"Please send some valid String");
}
// further processing with the string value
}
}
Output:
Exception in thread "main" java.lang.NullPointerException:
Please send some valid String
at in.bench.resources.exception.handling
.ThrowsKeywordWithUncheckedException.anotherMethod(
ThrowsKeywordWithUncheckedException.java:19)
at in.bench.resources.exception.handling
.ThrowsKeywordWithUncheckedException.main(
ThrowsKeywordWithUncheckedException.java:9)
Explanation:
- When unchecked exception is thrown/raised then compiler never complains with compile-time error
- Reason: it is due to the lack of proper coding and pre-condition checking by programmer
- Therefore, it is duty of programmer to do proper coding to handle all possible types of unchecked exception in the program
- Otherwise, program terminate abruptly when last entry of the runtime stack is reached and
- default exception handler takes care of printing exception information in the console
2.4 Any number of exceptions can be declared using throws clause, with each exception-type is separated by comma (,)
NumberOfExceptionsDeclaredUsingThrowsClause.java
package in.bench.resources.exception.handling;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class NumberOfExceptionsDeclaredUsingThrowsClause {
public static void main(String[] args) {
// invoking method
try {
printFileContent();
}
catch (FileNotFoundException fnfex) {
System.out.println("Exception handled ... \n"
+ fnfex.getMessage());
}
}
// throws clause for checked exception
public static void printFileContent()
throws FileNotFoundException, ArithmeticException,
NullPointerException {
// assumed that,
// we are trying to access file from remote location
FileReader fileReader = new FileReader(
"D:/Folder/test.txt");
// reading & processing file
// arithmetic calculation
int result = 19/0;
// string computation
String str = null;
System.out.println("The length of the String is : "
+ str.length());
}
}
Explanation:
- From above example, it is clear that using throws clause, any number of exception can be declared with comma separating them
- There are 3 types of exceptions are declared (both including checked & unchecked exception)
- Whenever checked-exception is raised/thrown, then compiler forces/tells programmer to handle exception either with try-catch block or throws clause
- For unchecked-exception like ArithmeticException or NullPointerException, it is propagated back up in the runtime stack by-default and compiler never complain with any compile-time error
- That’s reason, caller-method has to handle only FileNotFoundException
- Whereas it is a choice to programmer either to handle unchecked-exception for graceful termination or else it will be handled by Default exception handler when no handler-code is available
- Giving control to Default exception handler result in abnormal termination
2.5 Constructor can also declare exception using throws clause
- It is valid to declare exception for Constructor using throws clause
- This is required whenever Constructor does some job which might raise exception while constructing Object
- In the below example, Constructor tries to read file from some drive location which might raise FileNotFoundException (or it’s super-type IOException) when Object is constructed
ConstructorDeclaringExceptionUsingThrowsClause.java
package in.bench.resources.exception.handling;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class ConstructorDeclaringExceptionUsingThrowsClause {
// default constructor
public ConstructorDeclaringExceptionUsingThrowsClause(String str)
throws FileNotFoundException {
// assumed that,
// we are trying to access file from remote location
FileReader fileReader = new FileReader(str);
// reading & processing file
System.out.println("Successful: File reading and processing done !!");
}
public static void main(String[] args)
throws FileNotFoundException {
ConstructorDeclaringExceptionUsingThrowsClause cdeutc =
new ConstructorDeclaringExceptionUsingThrowsClause(
"test.txt");
}
}
Output:
Successful: File reading and processing done !!
3. Try-catch block v/s throws clause for checked exception:
- Whenever we try to handle some checked-exception using try-catch block and that checked-exception might never raise then compile-time error will be thrown stating “Unreachable catch block for IOException. This exception is never thrown from the try statement body”
- This is applicable only when handling checked-exception using try-catch block; but compiler never throws compile-time error for declared checked exception using throws clause
Error-scenario : Screen-capture for try-catch block when checked exception never arises
4. No error for throws clause:
- Screen-capture for throws clause when checked exception never arise
- But when same checked exception is declared using throws clause, then it never complains & also never raises any compile-time error like in earlier case
In the following articles, we will see
- Exception propagation in Java
- Exception handling with respect to Method Overriding in Java
- Difference between throw v/s throws keywords in Java
Related Articles:
- Java – Exception Handling
- Java – Exception Hierarchy
- Java – 5 important keywords in Java Exception handling
- Java – Runtime mechanism, what happens when exception is thrown ?
- Java – Checked Exception v/s Unchecked Exception
- Java – Exception propagation
- Java – try-catch block
- Java – finally block
- Java – try with multiple catch blocks
- Java – Nested try-catch block
- Java – Returning value from method having try-catch-finally blocks
- Java – return statement with finally block
- Java – final v/s finally v/s finalize
- Java – Various methods to print exception information
- Java – throw keyword
- Java – throws keyword
- Java – throw v/s throws
- Java – Difference between throws clause and try-catch-finally block
- Java – Rules for Exception handling w.r.t Method Overriding
- Java – User-defined or Custom exception
- Java – Difference between ClassNotFoundException v/s NoClassDefFoundError
- Java – Top Exception and Error
- Java – Interview question and answers on Exception Handling
- Java 7 – try with resources
- Java 7 – multi-catch block
References:
- https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html
- https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html
- https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
- https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html
- https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
- https://docs.oracle.com/javase/tutorial/essential/exceptions/
- https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
- https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
- https://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html
- https://docs.oracle.com/javase/7/docs/api/java/lang/ArithmeticException.html
- https://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html
- http://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html
- http://www.oracle.com/technetwork/java/effective-exceptions-092345.html
- http://otfried.org/courses/cs206/slides/slides-stackframes.pdf
Happy Coding !!
Happy Learning !!