In a hypothetical situation I have a class like this:
import java.io.File;
import java.util.Scanner;
class X
{
static Scanner scanner;
static
{
scanner = new Scanner(new File("X.txt"));
}
}
When compiling, I get
unreported exeption
java.io.FileNotFoundException
; must be caught or declared to be thrown
because public Scanner(File source) throws FileNotFoundException
.
To fix this, I can put scanner = new...
line in a try/catch statement:
static
{
try
{
scanner = new Scanner(new File("X.txt"));
}
catch(Exception e)
{
e.printStackTrace();
}
}
However, is there any way I can do something like:
static throws java.io.FileNotFoundException
{
scanner = new Scanner(new File("X.txt"));
}
This is a hypothetical situation. Please don't say "well why would you want to do that?" or "Here's a better way to make a Scanner!"
A static block can throw only a RunTimeException, or there should be a try and catch block to catch a checked exception. A static block occurs when a class is loaded by a class loader.
Throwing exceptions in static block Herefore, if you throw an exception using the throw keyword in a static block you must wrap it within try-catch blocks else a compile time error will be generated.
Unlike C++, Java supports a special block, called a static block (also called static clause) that can be used for static initialization of a class. This code inside the static block is executed only once: the first time the class is loaded into memory.
Static blocks are executed only once as the class file is loaded to memory. A class can have any number of static initialization blocks. The execution of multiple static blocks will be in the same sequence as written in the program. For example, the static blocks are executed from top to bottom.
From JLS §11.2.3:
It is a compile-time error if a class variable initializer (§8.3.2) or static initializer (§8.7) of a named class or interface can throw a checked exception class.
For completeness, an unchecked exception is defined in JLS §11.1.1:
RuntimeException
and all its subclasses are, collectively, the run-time exception classes.The unchecked exception classes are the run-time exception classes and the error classes.
This is the only type of exception that can be thrown from a static initializer.
Static code blocks cannot throw Checked Exceptions, you can catch the checked exception, log it appropriately and throw a Runtime Exception. You would want to nest the checked exception as root cause.
However the exception you finally receive will be some form of ClassInitializationException and you can look into the nested exceptions to determine root cause.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With