Java имеет функцию, называемую «проверенные исключения». Это означает, что существуют определенные виды исключений, а именно те, которые подклассируют Exception, но не RuntimeException, так что если метод может их выбросить, он должен перечислить их в своем объявлении throws, скажем: void readData () throws IOException. IOException является одним из них.
Таким образом, когда вы вызываете метод, который перечисляет IOException в своем объявлении throws, вы должны либо перечислить его в своем собственном объявлении throws, либо перехватить его.
Обоснование наличия проверенных исключений заключается в том, что для некоторых видов исключений вы не должны игнорировать тот факт, что они могут произойти, потому что их возникновение является довольно обычной ситуацией, а не ошибкой программы. Таким образом, компилятор помогает вам не забывать о возможности возникновения такого исключения и требует, чтобы вы каким-то образом обрабатывали его.
Однако не все отмеченные классы исключений в стандартной библиотеке Java подпадают под это обоснование, но это совершенно другая тема.