【问题标题】:Java: MySQL object throws error on closing connectionJava:MySQL 对象在关闭连接时抛出错误
【发布时间】:2015-03-19 19:36:33
【问题描述】:

我是 java 的新手,我已经编写了一个对象(在 http://www.tutorialspoint.com/jdbc/ 的帮助下)来处理这样的 MySQL 数据库连接:

package rekening.db;
import java.sql.*;

public class dbConnection1 {
private final String dbUrl;
private final String dbUser;
private final String dbPass;
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;

/**
 * @param args the command line arguments
 */
//Constructor
public dbConnection1(String dbUrl, String dbUser, String dbPass) {
    this.dbUrl = dbUrl;
    this.dbUser = dbUser;
    this.dbPass = dbPass;

}

public boolean initiateConnection() throws SQLException {
try{
   //STEP 2: Register JDBC driver
   Class.forName("com.mysql.jdbc.Driver");

   //STEP 3: Open a connection
   System.out.println("Connecting to database...");
   conn = DriverManager.getConnection(dbUrl,dbUser,dbPass);
   return true;
}catch(SQLException se){
   //Handle errors for JDBC
   se.printStackTrace(); 
}catch(Exception e){
   //Handle errors for Class.forName
   e.printStackTrace();
}
return false;
}

public ResultSet executeQuery(String dbStatement) throws SQLException {
try{
   //STEP 4: Execute a query
   System.out.println("Creating statement...");
   stmt = conn.createStatement();
   String sql;
   sql = dbStatement;
   ResultSet rs = stmt.executeQuery(sql);

   //STEP 5: Extract data from result set
   while(rs.next()){
      //Retrieve by column name
      String DESC_ORIGINAL = rs.getString("DESC_ORIGINAL");
      String DESC_TRIMMED = rs.getString("DESC_TRIMMED");
      String DESC_EDITED = rs.getString("DESC_EDITED");
      String DESC_CATEGORY_EDITED = rs.getString("DESC_CATEGORY_EDITED");
      String DESC_SUBCATEGORY = rs.getString("DESC_SUBCATEGORY");


      //Display values
      System.out.print("Orignal: " + DESC_ORIGINAL);
      System.out.print(", Trimmed: " + DESC_TRIMMED);
      System.out.print(", Edited: " + DESC_EDITED);
      System.out.println(", Category: " + DESC_CATEGORY_EDITED);
      System.out.println(", Subcategory: " + DESC_SUBCATEGORY);
   }
   return rs;
   }catch(SQLException se){
   //Handle errors for JDBC
   se.printStackTrace(); 
   }

return rs;
}

public void closeConnection() throws SQLException {
   //STEP 6: Clean-up environment
try{
   rs.close();
   stmt.close();
   conn.close();
}
catch (SQLException se){
   //Handle errors for JDBC
   se.printStackTrace(); 
} 
finally{
   //finally block used to close resources
   try{
      if(stmt!=null)
         stmt.close();
   }catch(SQLException se2){
   }// nothing we can do
   if(conn!=null)
       conn.close();
}//end try        
}
}

我主要调用 dbConnection1 对象:

try {
    dbConnection1 dbConn = new dbConnection1("jdbc:mysql://192.168.1.550/Finance","test","");
    dbConn.initiateConnection();
    dbConn.executeQuery("SELECT DESC_ORIGINAL, DESC_TRIMMED, DESC_EDITED, DESC_CATEGORY_EDITED, DESC_SUBCATEGORY FROM `TOOL.DESCRIPTION`");
    dbConn.closeConnection(); 
} catch (SQLException ex) {
    Logger.getLogger(Rekening.class.getName()).log(Level.SEVERE, null, ex);
}

输出返回以下错误。但奇怪的是它返回了数据库中的行。错误在结果集之间。最后它说构建成功。有人可以帮我吗?谢谢!!

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at rekening.db.dbConnection1.closeConnection(dbConnection1.java:105)
at rekening.ui.Rekening$1.run(Rekening.java:85)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 1 second)

【问题讨论】:

  • 好吧,你在 closeConnection 中得到了 NullPointerException。 closeConnection 中正在访问三个对象:rs、`stmt, and conn`。您需要确保它们都不为空。
  • 这是因为当您说ResultSet rs = stmt.executeQuery(sql); 时,您正在定义一个新的ResultSet。然后在类级别定义的仍然是null,所以当你尝试关闭它时......繁荣。
  • 自 2007 年以来,您不再需要 Class.forName("com.mysql.jdbc.Driver"); 行。

标签: java mysql oop


【解决方案1】:

首先要注意的是,在任何情况下你都会关闭你的 stmt 和连接两次。首先在 try 块中,然后在 finally 块中......很难说更多,因为您的代码没有第 105 行 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多