Domanda

Il mio problema è che devo impostare una variabile in un'istruzione try, altrimenti visualizzo un errore di compilazione.

In seguito ho bisogno di usare quella variabile ma ora è fuori campo, o almeno credo. Inizializzo la variabile fuori dall'istruzione try e la imposto su null, ho pensato che potesse essere accessibile all'esterno, ma ottengo ancora un NullPointerException.

Il codice è sotto, con molti di questi estratti per facilitare la lettura - so che è un codice errato, ma sono nuovo di Servlet e volevo solo vederlo in esecuzione con tutte le parti mobili che fanno quello che dovrebbero.

Ho creato un'altra classe che chiama createDocs (...) e passa i parametri richiesti, e funziona benissimo. Questo mi sta incuriosendo sul perché quando chiamo rs.getString("name") ottengo il <=>, poiché questo è esattamente quello che faccio dall'altra classe (eseguito da un metodo principale per comodità) e funziona come previsto.

La variabile in questione è la variabile ResultSet " rs " -

public class AgReportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public AgReportServlet() {
        super();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet rs = null;
        try {
            rs = docs.getDocs(con, start, end, zone, locality);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                out.println(
                        "<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");

        // I have a resultset object need to iterate through it to display the file names

        try {
            while (rs.next()) { // page through the result set

                out.println(
                        "  <tr>\n" +
                                "    <td>: " + rs.getString("name") + "</td>\n" +
                                "  </tr>\n"
                );
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        out.println(
                "</table></body>\n" +
                        "</html>"
        );

        out.flush();
        out.close();
    }
}
È stato utile?

Soluzione

Il tuo problema è che se questa affermazione:

rs = docs.getDocs(con, start, end, zone, locality);

genera un'eccezione, quindi il valore di rs è ancora null. Quindi quello che vorrei fare è spostare il loop all'interno dello stesso blocco try-catch. In alternativa puoi verificare se è ancora nullo prima di provare a usarlo.

L'impostazione del valore su null all'esterno del blocco try-catch non è un codice errato. Questo è esattamente ciò che devi fare se vuoi che la variabile rs sia fuori dal blocco try (e che includa all'interno di una delle clausole catch). Il ciclo rs while dovrebbe probabilmente essere all'interno dello stesso blocco try.

Altri suggerimenti

Il modo in cui stai dichiarando la variabile rs e il primo blocco try / catch sono ok.

È solo che dopo il primo tentativo / cattura è necessario ricordare che rs continua sarà nullo se si è verificato un errore nel primo tentativo / cattura. Quindi assicurati di testare rs per null prima di provare ad accedervi.

Perché non aggiungi semplicemente un

if(rs != null)

prima

while(rs.next())

Questo dovrebbe aiutare (per quanto ho capito)

Grazie a tutti per il vostro aiuto. Per prima cosa mi hai aiutato a identificare che doveva essere emessa una sorta di eccezione. Quando ho guardato la console Tomcat ho visto che si trattava di un errore di classe non di fondo per il connettore MySQL. L'avevo incluso nel mio progetto, ma non all'interno del progetto stesso - l'ho semplicemente fatto pigramente riferimento nella mia directory lib, quindi alla fine l'eccezione ha causato il problema, ma usando i tuoi suggerimenti come se (rs! = Null) mi ha aiutato a ottenere alla causa principale.

Inizialmente pensavo che avesse a che fare con la variabile che non rientrava nell'ambito. Chiaramente non è stato così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top