2014-01-24 4 views
8

В гипотетической ситуации, у меня есть класс вроде этого:Может ли статический код блокировать исключения?

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

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

незарегистрированный Exeption java.io.FileNotFoundException; должны быть пойманы или объявлены брошенными

т.к. public Scanner(File source) throws FileNotFoundException.

Чтобы это исправить, я могу поставить scanner = new... линии в Try/поймать заявление:

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")); 
    } 

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

+0

Честно говоря, я не вижу здесь проблемы. –

ответ

7

От JLS §11.2.3:

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

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

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

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

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

6

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

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

Смежные вопросы