2009-05-10 5 views
0

Mein Problem ist, dass ich eine Variable in einer try-Anweisung setzen muss, sonst bekomme ich einen Kompilierfehler.Wie zu vermeiden, Variable in einer try-Anweisung setzen

Später muss ich diese Variable verwenden, aber es ist jetzt außerhalb des Geltungsbereichs, oder so glaube ich. Ich initialisiere die Variable außerhalb der try-Anweisung und setze sie auf null, ich dachte, dass sie dann draußen zugänglich sein könnte, aber ich bekomme immer noch eine NullPointerException.

Der Code ist unten, mit viel davon herausgenommen, um das Lesen zu erleichtern - ich weiß, es ist schlechter Code, aber ich bin neu Servlets und wollte nur sehen, dass es mit allen beweglichen Teilen läuft, was sie tun sollen .

Ich habe eine andere Klasse erstellt, die createDocs (...) aufruft und die erforderlichen Parameter übergibt, und es funktioniert gut. Das macht mich neugierig, warum, wenn ich rs.getString("name") anrufe, bekomme ich die NullPointerException, da dies genau das ist, was ich von der anderen Klasse mache (von einer Hauptmethode aus Bequemlichkeit) 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(); 
    } 
} 
+0

Sie erkennen, dass der Code eine gespeicherte XSS-Sicherheitsanfälligkeit aufweist? –

+0

Ich denke, das eigentliche Problem besteht darin, dass Sie nach dem Auslösen einer Ausnahme weitermachen, als ob nichts passieren würde.Wenn Sie eine Ausnahme auslösen oder einen Fehler zurückgeben, müssen Sie keine rs setzen. Hinweis: Wo die Stapelverfolgung läuft, wird der Benutzer sie nicht sehen. Es kann freundlicher sein, den Benutzer wissen zu lassen, dass ein Fehler aufgetreten ist. –

Antwort

5

Ihr Problem ist, dass, wenn diese Aussage:

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

eine Ausnahme wirft dann der Wert rs noch null ist. Also würde ich die Schleife innerhalb des gleichen try-catch Blocks bewegen. Alternativ können Sie überprüfen, ob es noch Null ist, bevor Sie versuchen, es zu verwenden.

Das Festlegen des Werts auf Null außerhalb des try-catch-Blocks ist jedoch kein fehlerhafter Code. Das ist genau das, was Sie tun müssen, wenn Sie die rs-Variable außerhalb des try-Blocks haben wollen (und das in einer der catch-Klauseln beinhaltet). Ihre rs while-Schleife sollte wahrscheinlich nur im selben try-Block sein.

+0

Danke Cletus, aber wissen Sie, warum ich eine NullPointerException beim Aufruf von rs.getString ("Name") bekomme? – Ankur

+0

Ich habe einen wichtigen Punkt Ihres Punktes verpasst. Jetzt aktualisiert. Wenn Sie Ihre Servlet-Protokolle überprüfen, werden Sie zweifellos feststellen, dass eine Ausnahme ausgelöst wurde, daher der Nullwert. – cletus

2

Warum gehst du nicht einfach hinzufügen ein

if(rs != null) 

vor

while(rs.next()) 

Diese helfen sollte (soweit ich es verstehe)

+0

Danke, ich werde das tun. Aber in diesem Fall sollte rs nicht null sein. Die Daten existieren und wenn die Methode von einer anderen Klasse aufgerufen wird, funktioniert es gut. Ist die Tatsache, dass es Null in Bezug auf die rs = docs.getDocs (con, Start, Ende, Zone, Lokalität); passiert in einer Versuchserklärung? – Ankur

+0

Ja, wie andere schon gesagt haben, können Sie nicht sicher sein, dass rs nach dem try-Block nicht null ist, da es einen Fehler geben kann. –

4

Die Art und Weise Sie die rs deklarieren Variable und der erste try/catch-Block ist in Ordnung.

Es ist nur, dass nach dem ersten Versuch/Fang Sie daran denken müssen, dass rs immer noch null sein wird, wenn es einen Fehler beim ersten Versuch/Catch gab. Stellen Sie also sicher, dass Sie rs für null testen, bevor Sie versuchen, darauf zuzugreifen.

0

Vielen Dank für Ihre Hilfe. Zuerst hast du mir geholfen zu erkennen, dass es eine Art von Ausnahme geben muss. Als ich mir die Tomcat-Konsole anschaute, konnte ich feststellen, dass es sich um einen Klassenfehler für den MySQL-Connector handelte. Ich hatte das in mein Projekt aufgenommen, aber nicht in das Projekt selbst - ich habe es einfach in meinem lib-Verzeichnis erwähnt, also hat die Ausnahme das Problem verursacht, aber die Verwendung Ihrer Vorschläge wie if (rs! = Null) hat mir geholfen zur Ursache.

Anfangs dachte ich, dass es etwas damit zu tun hat, dass die Variable nicht in der Reichweite ist. Das war es eindeutig nicht.