Question

Mon problème est que je dois définir une variable dans une instruction try, sinon je reçois une erreur de compilation.

Plus tard, je dois utiliser cette variable, mais elle est maintenant hors de portée, du moins je le crois. J'ai initialisé la variable en dehors de l'instruction try et l'ai définie sur null. Je pensais qu'elle pourrait alors être accessible en dehors, mais j'obtiens quand même un NullPointerException.

Le code est présenté ci-dessous. Une grande partie de ce code a été supprimée pour faciliter la lecture. Je sais que le code est mauvais, mais je suis nouveau dans Servlets et je voulais simplement le voir fonctionner avec toutes les parties mobiles faisant ce qu’elles sont supposées faire.

J'ai créé une autre classe qui appelle createDocs (...) et transmet les paramètres requis, et tout fonctionne correctement. Cela me rend donc curieux de savoir pourquoi quand j'appelle rs.getString("name") j'obtiens le <=>, car c'est exactement ce que je fais depuis l'autre classe (exécuté depuis une méthode principale pour plus de commodité) et cela fonctionne comme prévu.

La variable en question est 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();
    }
}
Était-ce utile?

La solution

Votre problème est que si cette déclaration:

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

lève une exception alors que la valeur de rs est toujours null. Donc, ce que je ferais serait de déplacer la boucle à l'intérieur du même bloc try-catch. Sinon, vous pouvez vérifier si elle est toujours nulle avant d'essayer de l'utiliser.

Définir la valeur sur null en dehors du bloc try-catch n'est cependant pas un mauvais code. C'est exactement ce que vous devez faire si vous voulez que la variable rs se trouve en dehors du bloc try (et cela inclut l'une des clauses catch). Votre boucle rs while devrait probablement se trouver dans le même bloc try.

Autres conseils

La façon dont vous déclarez la variable rs et le premier bloc try / catch est ok.

C’est juste qu’après le premier essai / attrape, vous devez vous rappeler que rs sera toujours nul (e) s'il y avait une erreur lors du premier essai / attrape. Assurez-vous simplement de tester n pour rs avant d'essayer d'y accéder.

Pourquoi ne pas simplement ajouter un

if(rs != null)

avant

while(rs.next())

Cela devrait aider (autant que je sache)

Merci à tous pour votre aide. D'abord, vous m'avez aidé à identifier qu'il devait y avoir une sorte d'exception. Quand j'ai regardé la console Tomcat, j'ai constaté qu'il s'agissait d'une erreur de classe et non de fonds pour le connecteur MySQL. J'avais inclus cela dans mon projet, mais pas dans le projet lui-même - je l'ai simplement mentionné paresseusement dans mon répertoire lib. à la cause première.

Au départ, je pensais que cela avait quelque chose à voir avec la variable étant hors de portée. Clairement, ce n’était pas ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top