Elliotte Rusty Harold is wrong.<p>Checked exceptions are problematic because they version poorly, they implicitly presume the wrong model of exception <i>handling</i>, and more importantly, they prematurely decide the application's desired policy for error handling by encoding the "checkedness" in the type itself, where it is not available for configuration by the programmer.<p>The poor versioning is obvious. The OP says <i>"The superclass/interface was not designed properly for extension. Specifically it did not take into account the exceptions overriders/implementers might reasonably want to throw"</i> - and the only problem with that is the well-known difficulty in predicting the future.<p>But actually, it's more subtle: exceptions are usually a desired encapsulation violation. When programming to an abstract interface, you don't want to know the details of how it's implemented, but all the ways it can fail are a <i>function</i> of how it's implemented. You can't reasonably require the design of the most abstract levels of the system to predict every possible low-level implementation failure and state them out long-hand; the only reasonable implementation would be "throws Exception", which defeats the whole point of checked exceptions.<p>By presuming the wrong model of handling, I'm referring to the burden of creating a tunnel through the type system for your exception type between the point of the throw and the point of the catch. This burden is set up to optimize for catching sooner rather than later. But the thing is, usually you never want to catch; usually, the only exception catching you want done is at the highest levels of the system, in an event loop or request dispatcher. If you were expecting an exception you'd want to catch, the situation isn't exceptional; instead, you shouldn't be using an API that throws. .NET's pattern of e.g. Int32.Parse() vs Int32.TryParse() exemplifies this.<p>The OP tries to argue against this with the distinction between runtime errors and exceptions: <i>"checked exceptions do not require the programmer to provide handlers in situations where no meaningful action can be taken. When no meaningful action can be taken Java programs throw Errors"</i>. And this brings me to my third point. The determination for whether meaningful action can be taken <i>varies from program to program</i>, and is encoded in the very exception handlers themselves - i.e. it's the programmer who makes that choice, not the people who defined the relevant exception types.<p>His examples of error - <i>out of memory error, stack overflow, class not found, etc.</i> - actually make more sense as reasons to completely terminate the application, rather than make any attempt to catch. They're not really errors so much as panics.