Buongiorno a tutti.
Mi trovo a postare dopo che ho sperimentato, per diversi mesi, delle situazioni di errore decisamente strane e controverse. L'ultima mi ha convinto a postare perchè forse sto sbagliando qualcosa.

Mi trovo in questa condizione: ho una Servlet (in realtà in più di una capita la stessa cosa) che saltuariamente lancia delle eccezioni che non possono verificarsi (o almeno non potrebbero).

Esempio:
codice:
// Recupero la sessione dell'utente, se ne ha una!
HttpSession s = request.getSession( false );

// Controllo se ha una sessione attiva:
if (s == null) {
   // Lo indirizzo verso una pagina d'errore, che gli indica che la sua sessione è scaduta.
   ...
}
Se riesco ad arrivare oltre il primo controllo, mi aspetto che esista una sessione e che essa sia attiva. Ora, se così è (ditemi se sto sbagliando), so per certo che all'interno della sessione esiste un oggetto: infatti ho un SessionListener che, alla creazione di una sessione, crea questo oggetto e lo butta dentro (una volta inserito questo oggetto non viene mai più rimosso fino alla invalidazione della sessione).

Quindi:
codice:
DatiUtente utente = (DatiUtente) s.getAttribute("utente");
if ( utente.isAbilitato() ) {
   // L'utente è abilitato a fare certe cose
} else {
   // L'utente non è abilitato a fare cose particolari
}
Ma, magia delle magie, capita che venga lanciata una NullPointerException all'esecuzione di questa seconda if... ergo, l'oggetto DatiUtente è nullo, ergo... che ergo? Che la sessione è scaduta fra il primo ed il secondo if?? Possibile??

Nessun problema insormontabile: ho tapezzato così:
codice:
DatiUtente utente = (DatiUtente) s.getAttribute("utente");
if (utente == null) {
   // Faccio finta che la sessione fosse già scaduta
   // e lo mando a spasso lo stesso...
}
if ( utente.isAbilitato() ) {
   // L'utente è abilitato a fare certe cose
} else {
   // L'utente non è abilitato a fare cose particolari
}
Oltre al fatto che la cosa non mi piace (ma non ho trovato altri sistemi più decenti), rende il codice della Servlet un porcile...

Ma veniamo all'assurdo: ho una bella pagina HTML con un form, grossomodo così fatto:
codice:
<form action="/Servlet?act=pippo" method="post">
   <select name="destinazione" size="1" style="width: 90%">
      <option value="0" selected="selected">Prima opzione</option>
      <option value="1" >Seconda opzione</option>
   </select>
</form>
Fra le varie opzioni presenti all'interno della combo box la prima viene sempre selezionata di default, quindi almeno un valore per quel campo c'è sempre.
Questo è il codice che raccoglie quel valore:
codice:
   ...
   String dst = request.getParameter("destinazione");
   int indice = Integer.parseInt( dst );
Oggi quel codice mi ha sollevato la seguente eccezione:
codice:
NumberFormatException: null
   at java.lang.Integer.parseInt(unknown source)
   ...
Domanda: ma come è possibile che sia arrivato un valore nullo se almeno un valore è sempre selezionato?? Da notare che la parte di codice che ho postata è subordinata all'esistenza di una sessione attiva...

Chiedo lumi a chi con le Servlet ci programma da più tempo di me...


Ciao.