 <p>Technically, the distinction is not really made between "unrecoverable error" and "recoverable error", but between checked exceptions and unchecked exceptions. Java <em>does</em> distinguish between them as follows:</p> <ul> <li>you <em>must</em> declare a checked exception in your <code>throws</code> clause; if using a method which throws a checked exception in a <code>try</code> block, you must either <code>catch</code> said exception or add this exception to your method's <code>throws</code> clause;</li> <li>you <em>may</em> declare an unchecked exception in your <code>throws</code> clause (not recommended); if using a method which throws an unchecked exception in a <code>try</code> block, you <em>may</em> <code>catch</code> that exception or add this exception to your method's <code>throws</code> clause (not recommended either).</li> </ul> <p>What is certainly not recommended, unless you <em>really</em> know what you are doing, is to "swallow" any kind of unchecked exception (ie, <code>catch</code> it with an empty block).</p> <p><code>Exception</code> is the base checked exception class; <code>Error</code> and <code>RuntimeException</code> are both unchecked exceptions, and so are all their subclasses. You will note that all three classes extend <code>Throwable</code>, and the javadoc for <code>Throwable</code> states that:</p> <blockquote> <p>For the purposes of compile-time checking of exceptions, Throwable and any subclass of Throwable that is not also a subclass of either RuntimeException or Error are regarded as checked exceptions.</p> </blockquote> <p>Classical examples of (in)famous unchecked exceptions:</p> <ul> <li><code>OutOfMemoryError</code> (extends <code>Error</code>);</li> <li><code>StackOverflowError</code> (extends <code>Error</code>);</li> <li><code>NullPointerException</code> (extends <code>RuntimeException</code>);</li> <li><code>IllegalArgumentException</code> (extends <code>RuntimeException</code>);</li> <li>etc etc.</li> </ul> <p>The only real difference between <code>Error</code> and <code>RuntimeException</code> is their estimated severity level, and is a "semantic" difference, not a technical difference: ultimately, both behave the same. Some IDEs (Intellij IDEA comes to mind) will also yell at you if you catch an <code>Error</code> but do not rethrow it.</p>