2017-10-09 1 views
0

Ich versuche auf eine Datenbank in Netbeans zuzugreifen, und dies ist das erste Mal, dass ich dies getan habe. Ich habe ein Problem, wenn ich zu der finally Aussage komme. Die Connection und die PrintWriter scheinen nicht zu registrieren und ich bin mir nicht sicher, was ich falsch gemacht habe. Das Problem kommt mit der Verwendung der Variablen con in der try/catch und dann die Variable out danach.endlich Anweisung funktioniert nicht in try/catch Java?

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 


@WebServlet(name = "DBServlet1", urlPatterns = {"/db1"}) 
public class DBServlet1 extends HttpServlet { 

/** 
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
* methods. 
* 
* @param request servlet request 
* @param response servlet response 
* @throws ServletException if a servlet-specific error occurs 
* @throws IOException if an I/O error occurs 
*/ 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    //Connection con = null; 
    //PrintWriter out = response.getWriter(); 

    try (PrintWriter out = response.getWriter()) { 

     Connection con = null; 

     // Load the Driver class file 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 

     // Make a connection to the ODBC datasource Movie Catalog 
     // In this example we are opening a connection to the 
     // database with every request. 
     con = DriverManager.getConnection("jdbc:derby://localhost:1527/movies","user1", "password"); 

     if (con != null) { 
      out.println("<html>\n<body>\n<table border=\"1\" width=\"100%\">"); 
      // Create the statement 
      Statement statement = con.createStatement(); 
      ResultSet rs = statement.executeQuery("SELECT * FROM USER1.TMovie"); 
      ResultSetMetaData rsmd = rs.getMetaData(); 
      int columnCount = rsmd.getColumnCount(); 
      out.println("<tr>"); 

      for(int i=1; i<=columnCount; i++) { 
       out.println("<td><h3>" +rsmd.getColumnName(i) + "</td>"); 
      } 
      out.println("</tr>"); 

      while (rs.next()) { 
       out.println("<tr>"); 
       // get the id, which is an int 
       out.println("<td>" + rs.getInt("id") + "</td>"); 
       // get the name, which is a String 
       out.println("<td>" + rs.getString("title") + "</td>"); 
       // get the rating, which is a String 
       out.println("<td>" + rs.getString("rating") + "</td>"); 
       // get the price, which is a Float 
       out.println("<td>" + rs.getFloat("price") + "</td>"); 
       // get the Quantity, which is a Integer 
       out.println("<td>" + rs.getInt("quantity") + "</td>"); 
       // get the Category, which is a Integer 
       out.println("<td>" + rs.getString("category") + "</td>"); 
       out.println("</tr>"); 
      }// end while 
      // Close the ResultSet 
      rs.close(); 
      out.println("</table>"); 
     }// end if 
     else { 
      out.println("Data Not Found"); 
     } 
    }catch (Exception e) { 
     System.err.println(e.getMessage()); 
    }// end try-catch 
    finally { 
     try{ 
      if (con != null) { 
       // Close the connection no matter what 
       con.close(); 
      }// end if 
     } 
     catch (SQLException sqle) { 
      System.err.println(sqle.getMessage()); 
     }// end try-catch 
    }// end finally 
    out.close(); 

Antwort

2

Die Verbindung und der PrintWriter scheinen nicht zu registrieren und ich bin mir nicht sicher, was ich falsch gemacht habe.

Sie sind beide erklärt innerhalb der try Block. Sie sind also genauso wie jede andere Block-Bereichsvariable außerhalb dieses Blocks nicht zugänglich. Wenn Sie im catch oder finally darauf zugreifen müssen, müssen Sie sie außerhalb der try deklarieren.


Randbemerkung: Der Code wäre einfacher, wenn Sie für alle Auto-closeables einen Try-mit-Ressourcen-Anweisung (nicht nur die PrintWriter), z.B. mit der Verbindung und Aussage (n) auch; und wenn Sie es richtig verwenden (Sie schließen die Dinge nicht, die Sie in den Versuchen-mit-Ressourcen öffnen, tut es); tutorial.

Hier ist ein Beispiel, beachten Sie die *** Kommentare:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 

    // Load the Driver class file 
    try { 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 
    } catch (Exception e) { 
     // *** Ideally, do something more useful with the exception or *don't* catch it 
     System.err.println(e.getMessage()); 
     return; 
    } 

    try (
     // *** Note all auto-closeables are created here 
     PrintWriter out = response.getWriter(); 
     // Make a connection to the ODBC datasource Movie Catalog 
     // In this example we are opening a connection to the 
     // database with every request. 
     Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/movies","user1", "password"); 
     // Create the statement 
     Statement statement = con.createStatement(); 
     ResultSet rs = statement.executeQuery("SELECT * FROM USER1.TMovie"); 
     ) { 

     out.println("<html>\n<body>\n<table border=\"1\" width=\"100%\">"); 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     int columnCount = rsmd.getColumnCount(); 
     out.println("<tr>"); 

     for(int i=1; i<=columnCount; i++) { 
      out.println("<td><h3>" +rsmd.getColumnName(i) + "</td>"); 
     } 
     out.println("</tr>"); 

     while (rs.next()) { 
      out.println("<tr>"); 
      // get the id, which is an int 
      out.println("<td>" + rs.getInt("id") + "</td>"); 
      // get the name, which is a String 
      out.println("<td>" + rs.getString("title") + "</td>"); 
      // get the rating, which is a String 
      out.println("<td>" + rs.getString("rating") + "</td>"); 
      // get the price, which is a Float 
      out.println("<td>" + rs.getFloat("price") + "</td>"); 
      // get the Quantity, which is a Integer 
      out.println("<td>" + rs.getInt("quantity") + "</td>"); 
      // get the Category, which is a Integer 
      out.println("<td>" + rs.getString("category") + "</td>"); 
      out.println("</tr>"); 
     }// end while 
     // *** Don't close auto-closeables like the result set 
     out.println("</table>"); 
     /* *** This else was connected to an if (con != null), so the message doesn't really make sense 
     else { 
      out.println("Data Not Found"); 
     } 
     */ 
    } catch (Exception e) { 
     // *** Ideally, do something more useful here or don't catch the exception 
     System.err.println(e.getMessage()); 
    } 
    // *** No `finally` at all 
} 

I nicht einen vollständigen Code Audit oder irgendetwas getan, habe ich bei der Nutzung von Ressourcen nur an und wies darauf hin, Änderungen in Bezug auf sie richtig behandeln.

+0

Vielen Dank, ich habe keine Fehler im Code jetzt und ein wenig besseres Verständnis, aber dies zeigt immer noch nicht die Db-Werte – Jaqtaris

+0

Ich hatte die falsche Adresse für die db, alle behoben! Danke für eine ausführliche Erklärung :) – Jaqtaris

1

Der Gültigkeitsbereich der Variablen con und out ist nicht korrekt. Sie müssen sie vor dem Versuch/catch/endgültig blockieren deklarieren.

0

Variablen deklarieren, bevor Try-with-Ressourcenblock: -

Connection con = null;   
PrintWriter out =null, 

und dann schreiben versuchen-with-Ressourcenblock wie folgt aus: -

try (out = response.getWriter()) { 
//here is your code