继我之前的question后,我发现我的代码中的罪魁祸首就是这个对象
我在Java中的Connection类中有一个名为“conn”的对象。
在我的旧代码中,没有突出显示对象名称。如下所示。
然而,在Eclipse的新版本代码中,由于该对象始终为null而无效,因此该对象不起作用。
我的 DatabaseLogic 类
package org.ari;
//class dependencies
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DatabaseLogic
{
private static Connection conn;
public static String openDatabase() throws IOException, SQLException,
NamingException
{
// context class gives naming standards of the surrounding environment
// of the servlet i.e. the web server ,
// allowing the servlet to interface with the web servers resources
Context initialContext = new InitialContext();
Context envContext = (Context) initialContext.lookup("java:comp/env");
// servlet looks up for a connection pool called "jdbc/POOL"
DataSource ds = (DataSource) envContext.lookup("jdbc/POOL");
// connection is then made/requests to connection pool
String result = ds.toString();
try
{
conn = ds.getConnection();
}
catch (SQLException e)
{
System.out.println( e.toString());
}
return result;
}
public static void closeDatabase()
{
try
{
conn.close();
}
catch (SQLException e)
{
}
}
// queryId is the parameter to be used for querying for relevant records
// - possibly change name to make it less specific e.g. recordid
public static String getData(String queryId, int requestNumber)
throws SQLException
{
String result = "";
if (queryId != null)
{
try
{
if (conn == null)
{
//result = "We are in here";
result = openDatabase();
}
// prepare a statement for use in query
Statement stmt = conn.createStatement();
// query parameratised with queryId
String qry = "SELECT RECORD_ID, USER_ID, OPERATION_CD, BUSCOMP_NAME, OPERATION_DT, FIELD_NAME, OLD_VAL, NEW_VAL, AUDIT_LOG, ROW_ID, BC_BASE_TBL FROM S_AUDIT_ITEM WHERE RECORD_ID='"
+ queryId + "'";
ResultSet results = stmt.executeQuery(qry);
result = XMLBuilder.xmlBuilder(results, queryId,
requestNumber);
// close the connection
stmt.close();
results.close();
}
catch (Exception e)
{
// log.error("Cannot connect to database :" + e);
}
}
else
{
// not sure if ever reached
result = "The query parameter is a null value";
}
return result;
}
}
这突出显示意味着什么,我猜测eclipse正在以不同的方式处理这个对象,这就是为什么这个对象不再正常运行的原因。
我如何解决这个问题?我已经尝试恢复旧版本的代码,但这个突出显示仍然是相同的。
我猜这是IDE中的某个设置。
由于
答案 0 :(得分:3)
因此,执行
时会出现NullPointerExceptionconn.createStatement();
这意味着conn
为空。
conn
在哪里初始化?就在此之前,在致电openDatabase()
。
openDatabase()
如何初始化变量?
try
{
conn = ds.getConnection();
}
catch (SQLException e)
{
System.out.println( e.toString());
}
abobe表示ds.getConnection()
返回连接,conn
不能为空(但它是),或conn
为空,因为ds.getConnection()
抛出一个SQLException,但你继续好像没有发生任何事情,只显示抛出的异常的toString()。以上内容应改写如下:
conn = ds.getConnection();
这样,你就不会忽略SQLException。它将传播给调用者,并将被标识为SQLException,带有明确的错误消息,指示代码中的问题来源,而不是稍后发生的模糊NullPointerException,并且更难诊断。
让异常传播,或者至少通过以下方式替换代码:
try {
conn = ds.getConnection();
}
catch (SQLException e) {
throw new RuntimeException("Something really bad happened, and it makes no sense to continue further, so I'll throw a runtime exception wrapping the original cause", e);
}
现在您只需要获取ds.getConnection()
抛出的SQLException的堆栈跟踪,并了解它的错误消息意味着什么。
请注意,我怀疑conn.createStatement()
不会抛出异常,但是您在以下内容中忽略了一些其他异常:
catch (Exception e)
{
// log.error("Cannot connect to database :" + e);
}
再一次,不要抓住异常。让它传播。通过捕捉它,你会让自己很难注意到这个问题,而且无法对它进行诊断。
如果您无法处理异常,请不要抓住它。