Могут ли статические блоки кода генерировать исключения?

В гипотетической ситуации у меня есть такой класс:

import java.io.File;
import java.util.Scanner;
class X
{
    static Scanner scanner;
    static
    {
        scanner = new Scanner(new File("X.txt"));
    }
}

При компиляции получаю

исключение не сообщается java.io.FileNotFoundException; должен быть пойман или объявлен брошенным

так как public Scanner(File source) throws FileNotFoundException,

Чтобы это исправить я могу поставить scanner = new... строка в инструкции try/catch:

    static
    {
        try
        {
            scanner = new Scanner(new File("X.txt"));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

Тем не менее, есть ли способ, которым я могу сделать что-то вроде:

    static throws java.io.FileNotFoundException
    {
        scanner = new Scanner(new File("X.txt"));
    }

Это гипотетическая ситуация. Пожалуйста, не говорите "ну, почему вы хотите это сделать?" или "Вот лучший способ сделать сканер!"

2 ответа

Решение

Из JLS §11.2.3:

Это ошибка времени компиляции, если инициализатор переменной класса ( §8.3.2) или статический инициализатор ( §8.7) именованного класса или интерфейса может выдать проверенный класс исключений.

Для полноты в JLS §11.1.1 определено непроверенное исключение:

RuntimeException и все его подклассы вместе являются классами исключений во время выполнения.

Классы непроверенных исключений - это классы исключений во время выполнения и классы ошибок.

Это единственный тип исключения, которое может быть вызвано статическим инициализатором.

Блоки статического кода не могут генерировать проверенные исключения, вы можете поймать проверенное исключение, зарегистрировать его соответствующим образом и выдать исключение времени выполнения. Вы хотите вложить проверенное исключение в качестве основной причины.

Однако, в конечном итоге, вы получите исключение ClassInitializationException, и вы можете посмотреть на вложенные исключения, чтобы определить основную причину.

Другие вопросы по тегам