Java 在两个版本的代码中,类对象的语法高亮显示是不同的
继我之前的代码之后,我发现代码中的罪魁祸首是这个对象 我从Java中的类连接中得到了一个名为“conn”的对象 在我的旧代码中,没有突出显示对象名称。正如你在下面看到的 然而,在我更新版本的Eclipse上的代码中,由于该对象在高亮显示时始终为null,因此无法工作 我的数据库逻辑课程Java 在两个版本的代码中,类对象的语法高亮显示是不同的,java,eclipse,object,Java,Eclipse,Object,继我之前的代码之后,我发现代码中的罪魁祸首是这个对象 我从Java中的类连接中得到了一个名为“conn”的对象 在我的旧代码中,没有突出显示对象名称。正如你在下面看到的 然而,在我更新版本的Eclipse上的代码中,由于该对象在高亮显示时始终为null,因此无法工作 我的数据库逻辑课程 package org.ari; //class dependencies import java.io.IOException; import java.sql.Connection; impor
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中的某个设置
谢谢因此,执行时会出现NullPointerException
conn.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();
catch (Exception e)
{
// log.error("Cannot connect to database :" + e);
}
这样,您就不会忽略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()
引发的,而是由您在以下过程中也忽略的某个其他异常引发的:
conn = ds.getConnection();
catch (Exception e)
{
// log.error("Cannot connect to database :" + e);
}
再一次,不要捕捉异常。让它传播。通过抓住它,你很难发现问题,也无法诊断
如果无法处理异常,就不要捕获它。IDE只是帮助您编写Java代码。重要的是代码,而不是如何突出显示。如果有问题,那是由您编写的代码引起的,而不是Eclipse如何突出显示它。它以不同方式突出显示的事实可能表明它告诉您有一个潜在的bug,但没有看到代码和异常的堆栈跟踪,很难说。你能发布一个有效的
DatabaseLogic
类吗?@JBNizet如果你点击我问题中的超链接,它会把你带到我之前的超链接,我想知道为什么这个对象在应该设置时为空。ThanksI将再次发布类代码。那么,异常的堆栈跟踪是什么?请永远不要捕捉(异常),也不要像现在这样忽略异常。您将问题隐藏起来,使诊断变得非常困难。谢谢,您发出的runtimeexception消息没有出现在我的web服务器日志文件或浏览器上的输出中。它去哪里了?它去了catch(Exception){}
块,它捕获所有可能的异常并忽略它,就像我在回答的第二部分中解释的那样,好像没有发生什么不好的事情。但是我如何让它作为输出的html显示在浏览器上呢?让它传播吧。不要抓住它。在任何地方您的web容器将生成一个错误500,它通常包含异常的堆栈跟踪。java.sql.SQLException:READ_COMMITTED和SERIALIZABLE是唯一有效的事务级别