2017-10-09 47 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