Because...
NullPointerException is not a ServletException, nor an IOException, so the generic 'Exception' is the one to catch it.
When you say e.printStackTrace() that will print the exception out to the standard error, which is not the same as System.out (many times it is, but other times it can be different... for example, a
servlet container would probably direct System.err to an error log file)
When you catch the error, it won't bubble up to the System.out OR the System.err until you print it out to either one of those.
When you don't catch it, the servlet container will receive it, the container should construct a ServletException, and then that gets thrown out to the end user, which you will see.