Hi Fudong,
No, the "programmatic-vs-JVM" distinction isn't the same as "checked-vs-unchecked". Interestingly, this question actually came up a few times recently, so let me copy and paste something I
posted a few weeks ago that might help a little:
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 clarify this concept. Also, it may be helpful to read what the JLS has to say about
the causes of exceptions.