2015-08-02 3 views
-1

я не знаю, почему этот код компилируется на Java 7:java.io.Closeable: зачем бросать RuntimeException в close() работает?

class Lamb implements Closeable{ 
    @Override 
    public void close(){ 
    throw new RuntimeException(); 
    } 
} 

метод Close() из закрывающихся бросает IOException. При переопределении метода объявление «броски» должно оставаться неизменным или использовать подкласс. Теперь RuntimeException является «runtime», поэтому его не нужно объявлять (я получаю эту часть), но он наследует от Exception, а не IOException! Вы не можете расширить сферу действия, не так ли?

+0

Любой метод может выкинуть любое исключенное исключение, независимо от объявлений 'throws' (вы сказали это сами). Неважно, к какой ветви иерархии относится неконтролируемое исключение, потому что она не подлежит проверке (именно поэтому ее называют «непроверенным» исключением). –

ответ

2

Объявление «броски» должно оставаться неизменным или использовать подкласс.

Это неправда. Верно то, что предложение throws должно быть таким же или более ограничительным. Более ограничивающим является либо использование более ограничительного типа Exception (т. Е. Подкласс), либо , но не, заявляющее, что оно может генерировать исключение. Невозможность выбросить исключение является более ограничительной, чем возможность.

Я хотел бы также отметить, что, хотя этот метод не имеет неявные throws IOException в пункте throws, даже если он сделал это не будет противоречить throw new RuntimeException();. Любой метод может вызывать подкласс RuntimeException (также исключенное исключение), независимо от того, что написано после throws.

0

Не имеет значения, действительно ли RuntimeException наследует от IOException, потому что RuntimeException не участвует в проверке исключений, как вы уже признали в своем вопросе.

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