Java has a feature called "checked exceptions".
That means that there are certain kinds of exceptions,
namely those that subclass Exception but not RuntimeException,
such that if a method may throw them, it must list them
in its throws declaration, say: void readData() throws IOException.
IOException is one of those.
Thus, when you are calling a method that lists IOException
in its throws declaration, you must either list it in your
own throws declaration or catch it.
The rationale for the presence of
checked exceptions is that for some kinds of exceptions,
you must not ignore the fact that they may happen,
because their happening is quite a regular situation,
not a program error. So, the compiler helps you
not to forget about the possibility of such an
exception being raised and requires you to handle it in some way.