Почему ключевое слово throws не может обработать исключение, созданное в объявлении поля

В приведенном ниже коде Thread.sleep(3000);, написанный внутри экземпляра анонимного класса, может быть обработан только с помощью блока try-catch. Почему предложение throws InterruptedException не позволяет распространять исключение?

public static void main(String[] args) throws InterruptedException {
    Runnable task = new Runnable() {
        public void run() {
            // below line explicitly need to be handled using try-catch. throws keyword does not work here
            Thread.sleep(3000);         
        }
    };
}

person S Kumar    schedule 28.01.2018    source источник
comment
Это не имеет ничего общего с объявлением поля. Попробуйте поместить Runnable task = ... внутри метода: вы получите точно такую ​​же ошибку.   -  person Andy Turner    schedule 28.01.2018


Ответы (1)


В методе run() отсутствует предложение throws InterruptedException. Неважно, что он есть у main() или что run() определен в классе, определенном внутри main(). Это два разных метода.

Однако добавить его в run() невозможно, потому что Runnable не позволяет run() иметь предложение throws. Поэтому единственное решение — обернуть sleep блоком try/catch.

person John Kugelman    schedule 28.01.2018
comment
Тот же ответ. Вложенность не имеет значения. - person John Kugelman; 28.01.2018
comment
Итак, это означает, что внутри анонимного внутреннего класса исключение можно обработать только с помощью блока try-catch. - person S Kumar; 28.01.2018
comment
@SKumar no: исключение checked всегда должно обрабатываться либо с помощью try/catch, либо с объявлением throws в методе. Вы не можете добавить объявление throws к методу, который не является ковариантным ни с одним из объявлений throws того, что он переопределяет. Runnable.run() неявно throws RuntimeException, Error; InterruptedException не является ковариантным ни с тем, ни с другим, поэтому вы не можете добавить throws InterruptedException. Поэтому вы должны использовать try/catch. Если ваш анонимный класс был, например. Callable, вы можете использовать throws, потому что Callable.call() вызывает Exception. - person Andy Turner; 28.01.2018