【发布时间】: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, andconn`。您需要确保它们都不为空。 -
这是因为当您说
ResultSet rs = stmt.executeQuery(sql);时,您正在定义一个新的ResultSet。然后在类级别定义的仍然是null,所以当你尝试关闭它时......繁荣。 -
自 2007 年以来,您不再需要
Class.forName("com.mysql.jdbc.Driver");行。