今更だけど違いについて

違いはロジックによって
「回避できるか」
「回避できないか」

ExceptionのサブクラスであるIOException
たとえば開こうとしたファイルが他のプロセスにロックされていた場合に発生する
これはロジックで回避できない

RuntimeExceptionのサブクラスであるNullPointerException
ロジックでヌルチェックを入れるだけで絶対に発生しない

たぶんこんな感じ