2017-10-09 49 views
0

我想在netbeans中访问一个数据库,这是我第一次这样做。我遇到finally声明时遇到问题。 ConnectionPrintWriter似乎没有注册,我不知道我做错了什么。问题出现在try/catch中使用变量con,然后在变量out之后使用变量。finally语句不能在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(); 

回答

2

连接和PrintWriter似乎没有注册,我不知道我做错了什么。

他们都内的try块中声明。因此,就像任何其他块范围变量一样,它们不能在该块外部访问。如果您需要在catchfinally中访问它们,则需要在try之外声明它们。


边注:如果您使用的一个尝试,有资源的语句对所有自动closeables(不仅仅是PrintWriter),如该代码会更简单以及连接和声明;如果你正确地使用它(你没有关闭你在资源尝试中打开的东西,它会这样做)。 tutorial

下面是一个例子,注意***评论:

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 
} 

没有做了充分的代码审计或任何东西,我只是看着利用资源,并指出相关的变化正确处理它们。试穿与资源块之前

+0

谢谢你,我没有任何代码中的错误现在有了一些更好的理解,但这仍然不是显示数据库值 – Jaqtaris

+0

我有错误的数据库地址,都是固定的!感谢您的详细解释:) – Jaqtaris

1

变量con和out的范围不正确。你需要在try/catch/finally块之前声明它们。

0

声明变量: -

Connection con = null;   
PrintWriter out =null, 

然后写尝试,与资源块这样的: -

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