Бросать проверенные исключения из анонимных внутренних классов - PullRequest
6 голосов
/ 12 ноября 2011

Каков наилучший способ получения прозрачности исключений в Java при использовании анонимного внутреннего класса для запуска некоторого кода.

Частая картина, которую я видел в реальном коде, использует некоторый интерфейс псевдо Runnable типа, чтобы определить некоторый контекст для некоторого данного кода.Лучший пример, который я могу вспомнить в JDK, - это java.security.PrivilegedExceptionAction.

try {
    boolean success = AccessController.doPrivileged(
        new PrivilegedExceptionAction<Boolean>() {
            @Override
            public Boolean run() throws Exception {
                // do something
                // read file
                FileInputStream fileInputStream = 
                    new FileInputStream(new File("someFile"));
                return true;
            }
        }
    );
} catch (PrivilegedActionException e) {
    if (e.getCause() instanceof FileNotFoundException) {
        // handle IO exception
    } else {
        // impossible no other checked exception
    }
}

Несмотря на то, что при чтении кода вы можете ясно видеть, что внутренний код выдает только файл, не найденный, но мы потерялипреимущества проверенных исключений, так как вызывающий абонент не знает, какое исключение на самом деле выдается.Обычной ошибкой было бы введение кода в анонимный внутренний класс, который вызывал бы новое исключение, и код не заставлял бы вас обрабатывать это исключение.

То, что я хочу, это что-то вроде того, что ниже, возможно ли такое поведение без смены языка?

public interface PrivilegedExceptionAction<T,V... extends Throwable>
{
    public T run() throws V;
}

1 Ответ

3 голосов
/ 12 ноября 2011

Не понимаю, почему нет.Следующий код работал.

interface RunIt < E extends Exception >
{
    void run ( ) throws E ;
}

class App
{
    public static void main ( String [ ] args )
    {
        RunIt < RuntimeException > r = new RunIt < RuntimeException > ( )
        {
            public void run ( )
            {
                throw new RuntimeException ( ) ;
            }
        } ;
        r . run ( ) ;
    }
}
...