Innanzitutto hai verificato dai log stampati su System.out se ci sono problemi? Il punto è che nel tuo codice anche se ci sono problemi, va comunque sempre avanti. Se il driver non lo trova, certo stampi un messaggio ma l'esecuzione prosegue. Se a causa di questo non può ovviamente ottenere una Connection, anche qui stampi qualcosa su System.out ma la esecuzione arriva comunque alla creazione del PreparedStatement ma se connection è rimasto a null, ovviamente lì si schianta.
Un modo per evitare dubbi/problemi di questo tipo è innanzitutto quello di scrivere codice corretto, che gestisce le eccezioni in modo adeguato senza far andare avanti nel caso di errori precedenti.