Here's my take at this: I'd use exceptions as sparingly as possible and
only for cases where something unexpected (an exception!) happens. That
is, I wouldn't use exceptions e.g. for items not being found. This is
clearly something that happens all the time and is by no means
For the cases where exceptions are involved I would define our own very
small set of exceptions and make them all *unchecked*. Checked
exceptions compose very badly wrt. lazyness. For example an iterator
which lazily fetches its items on next() has no clean way of handling
exceptions in the next() method.
Only at the very last instance (i.e. in the jcr component) I would
actually create and throw the various RepositoryExceptions.
I'm not a fan of the "unchecked" pattern, but I agree with not throwing
at all for expected things, such as NotFound. Which reminds me of
considering nullability annotations so that the contract is well-defined.
+1 for nullability annotations. We need to decide on which one to use
however. There seems to be quite a bit of a discussion .
My gut feeling is "what Findbugs 2 is using, assuming it now works
again". Those IMHO should work with IntelliJ as well.