This concept of checked vs. unchecked exceptions doesn't exist in .net.
The intention of the original Java guru's was that if you have to declare the checked exceptions that you throw, so the caller will know that he/she has to catch them. for example, if you are dealing with the IO library, if forces you to catch the IOException.
try {
file.delete();
} catch (IOException x) {
// do something
}
Unfortunately checked exceptions are over-used in Java (see spring philosophy). There is a lot of criticism about the abuse of checked exception and how they pollute the code. Libraries that throw checked exceptions more often than not lead the users to write code like this:
try {
file.delete();
} catch (IOException e) {
throw new RuntimeException(e);
}
If you are writing a library, consider whether your checked exception will hinder/annoy the user, and whether he/she benefits from having to catch them.
There are different school of thoughts on this matter, but the overwhelming trend today is to avoid checked exceptions (see successful projects like spring, hibernate, apache-commons, etc.).
I can attest that today I don't throw checked exceptions anymore. If it is really important that the user should know about the exception, then document it well in the javadocs, but give the user the freedom to write cleaner code.
EDIT: I found a similar question (and one of my previous answers) here. Maybe it will help.