Pregunta

Mi problema es que tengo que establecer una variable en una declaración de prueba, de lo contrario obtengo un error de compilación.

Más adelante necesito usar esa variable pero ahora está fuera de alcance, o eso creo. Inicializo la variable fuera de la instrucción try y la configuro como nula, pensé que podría ser accesible desde afuera, pero aún obtengo un NullPointerException.

El código está debajo, con mucho de él extraído para facilitar la lectura. Sé que es un código incorrecto, pero soy nuevo en Servlets y solo quería verlo funcionando con todas las partes móviles haciendo lo que se supone que deben hacer.

He creado otra clase que llama a createDocs (...) y pasa los parámetros requeridos, y funciona bien. Entonces eso me da curiosidad sobre por qué cuando llamo a rs.getString("name") obtengo el <=>, ya que esto es exactamente lo que hago desde la otra clase (se ejecuta desde un método principal por conveniencia) y funciona como se esperaba.

La variable en cuestión es la variable 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();
    }
}
¿Fue útil?

Solución

Su problema es que si esta declaración:

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

arroja una excepción y el valor de rs sigue siendo null. Entonces, lo que haría es mover el bucle dentro del mismo bloque try-catch. Alternativamente, puede verificar si todavía es nulo antes de intentar usarlo.

Sin embargo, establecer el valor en nulo fuera del bloque try-catch no es un código incorrecto. Eso es justo lo que debe hacer si desea que la variable rs esté fuera del bloque try (y eso incluye dentro de una de las cláusulas catch). Su ciclo rs while probablemente debería estar dentro del mismo bloque de prueba.

Otros consejos

La forma en que declara la variable rs y el primer bloque try / catch está bien.

Es solo que después del primer intento / captura, debe recordar que rs seguirá será nulo si hubo un error en el primer intento / captura. Así que asegúrese de probar rs para nulo antes de intentar acceder a él.

¿Por qué no agregas simplemente un

?
if(rs != null)

antes

while(rs.next())

Esto debería ayudar (hasta donde yo entiendo)

Gracias a todos por su ayuda. Primero me ayudaste a identificar que tenía que haber algún tipo de excepción. Cuando miré la consola de Tomcat pude ver que era un error de clase no de fondo para el conector MySQL. Lo había incluido en mi proyecto, pero no dentro del proyecto en sí mismo, simplemente lo mencioné perezosamente en mi directorio lib, por lo que finalmente la excepción causó el problema, pero usar sus sugerencias como if (rs! = Null) me ayudó a obtener a la causa raíz.

Inicialmente pensé que tenía algo que ver con que la variable estuviera fuera de alcance. Claramente eso no fue todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top