Могут ли статические блоки кода генерировать исключения?
В гипотетической ситуации у меня есть такой класс:
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, и вы можете посмотреть на вложенные исключения, чтобы определить основную причину.