Pergunta

Meu problema é que tenho que definir uma variável em uma instrução TRY, caso contrário, recebo um erro de compilação.

Mais tarde, preciso usar essa variável, mas agora está fora de escopo, ou assim eu acredito. Eu inicializo a variável fora da declaração de tentativa e a defino como nulo, pensei que poderia ser acessível lá fora, mas ainda recebo um NullPointerException.

O código está abaixo, com muitos deles para facilitar a leitura - sei que é um código ruim, mas sou novo no Servlets e só queria vê -lo correndo com todas as partes móveis fazendo o que deveriam.

Eu criei outra classe que chama Createdocs (...) e passa nos parâmetros necessários, e funciona bem. Então isso está me deixando curioso sobre o porquê quando eu ligo rs.getString("name") Eu recebo o NullPointerException, como é exatamente isso que faço da outra classe (funcione de um método principal para conveniência) e funciona como esperado.

A variável em questão é a variável de resultado "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();
    }
}
Foi útil?

Solução

Seu problema é que, se esta declaração:

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

joga uma exceção, então o valor de Rs ainda é null. Então, o que eu faria é mover o loop para dentro do mesmo bloco de tentativa. Como alternativa, você pode verificar se ainda é nulo antes de tentar usá -lo.

Definir o valor como nulo fora do bloco de try-capath não é um código ruim. É exatamente isso que você precisa fazer se deseja a variável RS fora do bloco de tentativa (e isso inclui dentro de uma das cláusulas de captura). Seu RS enquanto o loop provavelmente deve estar apenas no mesmo bloco de tentativa.

Outras dicas

A maneira como você está declarando a variável RS e o primeiro bloco de tentativa/captura estão OK.

É só que, após a primeira tentativa, você precisa se lembrar de que o RS irá ainda Seja nulo se houve um erro na primeira tentativa/captura. Portanto, certifique -se de testar RS para NULL antes de tentar acessá -lo.

Por que você simplesmente não adiciona um

if(rs != null)

antes da

while(rs.next())

Isso deve ajudar (até onde eu entendo)

Obrigado a todos pela sua ajuda. Primeiro, você me ajudou a identificar que tinha que haver algum tipo de exceção sendo jogada. Quando olhei para o console do Tomcat, pude ver que era um erro de classe e não fundos para o conector MySQL. Eu incluí isso no meu projeto, mas não dentro do próprio projeto - apenas me referi preguiçosamente no meu diretório Lib, então, em última análise, a exceção causou o problema, mas usar suas sugestões como se (rs! = Nulo) me ajudou a obter para a causa raiz.

Inicialmente, pensei que tinha algo a ver com a variável estar fora de escopo. Claramente não era isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top