문제

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!"

도움이 되었습니까?

해결책

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top