The "programmatic-vs-JVM" distinction isn't the same as "checked-vs-unchecked". Here's something I
posted a few weeks ago that may help:
I'm not a fan of the term "thrown programmatically" as a supposed contrast to "thrown by the JVM". In my opinion, it's much clearer to think of it as "thrown
explicitly" (a.k.a. "programmatically") versus "thrown
implicitly" (a.k.a. "by the JVM").
Using this terminology, an "explicitly thrown" exception is one that can only be thrown in
Java code using a "throws" or "assert" statement, i.e. there must be some expression of programmer intent to (possibly) cause an exception at that point. On the other hand, an "implicitly thrown" exception is one that can occur even in expressions that have neither a "throws" or "assert". Most of these are the result of
abruptly completed evaluations, e.g. dereferencing a
null reference or an integer division by zero.
Hopefully this way of differentiating exceptions will help some of you. Also, it may be helpful to read what the JLS has to say about
the causes of exceptions.