RuntimeException and its subclasses occur entirely within the Java® runtime and are caused by programming errors and can only be sorted out by correcting the code.
Checked exceptions occur partially in the runtime and partially outside, and it is always possible to correct something
At least that is the theory. It shouldn't take somebody experienced more than about 15″ to find all sorts of exceptions to those assertions.
Unchecked exceptions can occur unexpectedly. For example you might divide by 0 or forget to instantiate a field and a null pointer exception occurs 10000 lines of code away. So it would not be a good idea to declare unchecked exceptions. There would simply be too many of them, and a catch would be difficult to implement. There are some exceptions, e.g.
this one, which can be avoided by judicious use of a loop. If you
test for something and throw an unchecked exception, make sure to notify it with a tag in the documentation comments.
If an IOException occurs because there is a loose network cable, it is possible to reconnect the cable and try again. So they thought it would be a suitable example to be a checked exception. You declare it with a throws clause and all code using that method must either handle it or pass it on to other code to handle.
As I said, that is the theory. It is by no means 100% accurate. If you declare a checked Exception it is likely that it will be handled somewhere and your application can continue to run even if the exception is thrown.