Just a long comment on toolkit's answer.
The reason Checked exceptions are a problem is that they eventually lead to code like this:
try {
Something that throws an exception
} catch (Exception e) {}
This is worst case. First of all, they are not logging that they are catching the exception. This happens a lot, and is almost FORCED by very stupid checked exceptions like the one on Thread.sleep(), it throws InterruptedException that MUST be caught, but 99% of the time you couldn't care less if you got one or not.
In the case above, it's compounded by the fact that people tend to just catch "Exception" if there are more than one thrown. That means that even if a critical unchecked exception is thrown, it will be caught and ignored making it virtually impossible to find the problem.
More than once I've been on teams that had to spend about a man-month trying to track down bugs hidden in this way.
It's a good concept that becomes horrible when you add in the fact that humans are the ones who must implement it responsibly.