Frage

Mein Problem ist, dass ich eine Variable in einer try-Anweisung zu setzen habe sonst bekomme ich einen Compiler-Fehler.

Später muss ich diese Variable verwenden, aber es ist jetzt außerhalb des Bereichs, oder so glaube ich. Ich initialisieren die Variable außerhalb der try-Anweisung und stellen Sie ihn auf Null zu bringen, dachte ich, dass es dann zugänglich draußen sein könnte, aber ich bekomme immer noch eine NullPointerException.

Der folgende Code ist, mit viel davon genommen zu erleichtern das Lesen - ich weiß, dass es schlecht Code, aber ich bin neu in Servlets und wollte nur sehen, es mit allen beweglichen Teilen zu tun laufen, was sie sollen.

Ich habe eine andere Klasse erstellt, die createDocs (...) und übergibt in den erforderlichen Parametern aufruft, und es funktioniert gut. Also das macht mich neugierig, warum, wenn ich rs.getString("name") nenne ich die NullPointerException bekommen, da dies genau das, was ich von der anderen Klasse zu tun (von einem Hauptverfahren für die Bequemlichkeit lief) und es funktioniert wie erwartet.

Die betreffende Variable ist die ResultSet Variable "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();
    }
}
War es hilfreich?

Lösung

Ihr Problem ist, dass, wenn diese Aussage:

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

wirft eine Ausnahme dann wird der Wert rs noch null wird. Also, was ich tun würde, ist die Schleife in dem gleichen try-catch-Block bewegen. Alternativ können Sie prüfen, ob es vor dem Versuch noch null ist, es zu benutzen.

den Wert Einstellung außerhalb des Try-Catch-Block auf null ist, wenn auch nicht schlechter Code. Das ist genau das, was Sie tun müssen, wenn Sie die rs Variable außerhalb des try-Blocks wollen (und das schließt in einem der catch-Klauseln). Ihre rs while-Schleife sollte wahrscheinlich nur innerhalb des gleichen try-Block.

Andere Tipps

Die Art und Weise Sie die rs Variable und der erste Try / Catch-Block deklarieren sind in Ordnung.

Es ist nur, dass nach dem ersten try / catch müssen Sie daran denken, dass rs wird noch null sein, wenn es ein Fehler in der ersten try / catch ist. Also nur sicherstellen, dass Sie rs für null testen, bevor Sie versuchen, darauf zuzugreifen.

Warum nicht einfach fügen Sie ein

if(rs != null)

vor

while(rs.next())

Dies sollte (soweit ich es verstehe) helfen

Vielen Dank allen für Ihre Hilfe. Zuerst half ihr mich erkennen, dass es irgendeine Art von Ausnahme sein hatte geworfen. Als ich an der Tomcat-Konsole sah konnte ich sehen, daß es eine Klasse war nicht Fehler für den MySQL-Anschluss finanzieren. Ich hatte eingeschlossen, dass in meinem Projekt, aber nicht in dem Projekt selbst - ich faul, um es nur in meinem lib bezeichnet, so letztlich die Ausnahme das Problem verursacht hat, aber Ihre Vorschläge mit, wie wenn (rs! = Null) hat mir geholfen zu bekommen auf die Ursache.

Am Anfang dachte ich, es hat etwas mit der Variable des Gültigkeitsbereich zu tun hatte zu sein. Klar, dass war es nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top