Почему выдает проверенное исключение

Я заметил, что методы в некоторых сложных библиотеках, включая стандартный JDK, имеют тенденцию к throws восходящему преобразованию исключений. Сначала я нашел это явление в исходном коде Apache POI, позже снова увидел его в java.io.FileWriter вот так:

public FileWriter(String fileName) throws IOException {
    super(new FileOutputStream(fileName));
}

где создание экземпляра FileOutputStream объявляет единственное проверенное исключение FileNotFoundException в этом стеке вызовов. Однако объявлен IOException, который является надклассом FileNotFoundException.

Так в чем причина этого? Или это просто зависит от привычки программиста?


person Cedric Sun    schedule 31.07.2017    source источник
comment
Что ты хочешь этим сказать? Тем не менее, IOException выбрасывается как его повышающий суперкласс. Мне эта фраза совсем не понятна.   -  person Jon Skeet    schedule 31.07.2017
comment
OP спрашивает, почему FileWriter выдает более общее исключение, чем его единственный вызов FileOutputStream.   -  person luk2302    schedule 31.07.2017
comment
@ luk2302: Я подозреваю, что это так, но, безусловно, было бы полезно, если бы ОП мог уточнить. (Здесь нет никакого приведения... есть только возможность объявить более общее проверенное исключение, чем это строго требуется по коду. Разговор о приведении делает этот вопрос запутанным.)   -  person Jon Skeet    schedule 31.07.2017
comment
См. также stackoverflow.com/questions/22610768/   -  person Raedwald    schedule 31.07.2017
comment
Историческая справка: в jdk 1.1 FileOutputStream(String) было объявлено как бросающее IOException. Следовательно, FileWriter(String), который использовал этот конструктор, также должен был быть объявлен как выбрасывающий IOException. Впоследствии FileOutputStream (но не FileWriter) был изменен, чтобы выдать более конкретный FileNotFoundException, но затем Javadoc был изменен, чтобы читать выбрасывает FileNotFoundException, если файл существует, но является каталогом, а не обычным файлом, не существует, но не может быть создан, или не может быть открыт по какой-либо другой причине. Мне кажется, что это вводящее в заблуждение исключение.   -  person Klitos Kyriacou    schedule 31.07.2017


Ответы (1)


Возможно, имеет смысл избегать слишком частого изменения API.
Сегодня метод может создать в коде подкласс IOexception, но завтра он может создать другой.

Хотя родительское исключение, объявленное в сигнатуре, не является слишком общим и не теряет ценности для клиентов, вполне допустимо объявить базовый класс для исключения.
Например, объявление throw Exception в качестве клиент не мог понять общий смысл исключения и соответственно обработать его.

person davidxxx    schedule 31.07.2017
comment
Поздравляю. Вы счастливый человек сегодня. Я как раз собирался закончить свой ответ, когда вопрос был закрыт. - person GhostCat; 31.07.2017
comment
@GhostCat Извините за GhostCat, я до сих пор помню, как впервые написал здесь, чтобы спросить что-то о java, и получил вашу критику :) (и это то, что меня продвигает). С нетерпением ждем встречи с вами в больше вопросов! - person Cedric Sun; 31.07.2017
comment
Добро пожаловать. И когда сегодня не приходит голосов, значит, по крайней мере, некоторые из них уходят. - person GhostCat; 31.07.2017