Это известная проблема. API определяет создатель библиотеки, а разделение между флоу и исключениями выполняется клиентским кодом. Это одна из причин, почему в джаве checked exceptions такие непопулярные - авторы
java.io решили, что IOException - это часть флоу, а 99% пользователей хотят при ошибке ввода-вывода просто пробросить исключение.