gpt4 book ai didi

java - 类对象的语法高亮在两个版本的代码中是不同的

转载 作者:行者123 更新时间:2023-11-29 05:50:35 24 4
gpt4 key购买 nike

继我之前的 question我发现我的代码中的罪魁祸首是这个对象

我有一个来自 Java 类 Connection 的名为“conn”的对象。

在我的旧代码中,没有突出显示对象名称。如下所示。

enter image description here

但是在我的 Eclipse 上较新版本的代码中,由于该对象始终为 null 而无法正常工作该对象被突出显示。

enter image description here

我的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 某处的一些设置。

谢谢

最佳答案

所以,你在执行的时候会得到一个 NullPointerException

conn.createStatement();

这意味着 conn 为空。

conn 在哪里初始化?就在之前,在对 openDatabase() 的调用中。

openDatabase() 如何初始化变量?

    try
{
conn = ds.getConnection();
}
catch (SQLException e)
{
System.out.println( e.toString());
}

abobe 表示 ds.getConnection() 返回一个连接,并且 conn 不能为 null(但它是),或者 conn 为 null,因为 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);
}

再一次,不要捕获异常。让它传播。通过捕捉它,您很难自己注意到问题,也无法诊断它。

如果您无法处理异常,请不要捕获它。

关于java - 类对象的语法高亮在两个版本的代码中是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14021214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com