【问题标题】:Syntax highlighting of class object is different in two versions of code两个版本的代码中类对象的语法高亮不同
【发布时间】:2012-12-24 12:09:33
【问题描述】:

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

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

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

但是,在我在 Eclipse 上的较新版本的代码中,由于该对象始终为空,因此该对象被突出显示。

我的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 中的某个设置。

谢谢

【问题讨论】:

  • IDE 只是帮助您编写 Java 代码。重要的是代码,而不是如何突出显示。如果有问题,它是由您编写的代码引起的,而不是由 Eclipse 突出显示它的方式引起的。它以不同的方式突出显示它的事实可能表明它告诉您您有一个潜在的错误,但是如果没有看到代码以及您得到的异常的堆栈跟踪,就不可能说出来。
  • 你能发布一个有效的DatabaseLogic类吗?
  • @JBNizet 如果您单击我的问题中的超链接,它会将您带到我的上一个问题,我想知道为什么该对象在应该设置时为空。谢谢
  • 我再贴一下课程代码
  • 那么,异常的堆栈跟踪是什么?并且请永远不要catch (Exception),也不要像您正在做的那样忽略异常。你对自己隐瞒了问题,因此很难诊断。

标签: java eclipse object


【解决方案1】:

所以,你在执行时会得到一个 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();

这样,您就不会忽略 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);
}

再一次,不要捕获异常。让它传播。抓住它,你就很难注意到问题,也无法诊断它。

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

【讨论】:

  • 谢谢,您提供的运行时异常消息未出现在我的 Web 服务器日志文件或浏览器输出中。去哪儿了?
  • 它进入catch(Exception) { } 块,该块捕获所有可能的异常并忽略它,好像没有发生任何不好的事情,正如我在答案的第二部分中解释的那样。
  • 但我如何让它在浏览器上显示为输出的 html?
  • 让它传播。不要抓住它。任何地方。并且您的 Web 容器会生成一个错误 500,其中通常包含异常的堆栈跟踪。
  • 好的,我现在收到一个有趣的错误,我认为这不是我的 servlet,而是数据库或 JDBC 池。 java.sql.SQLException: READ_COMMITTED 和 SERIALIZABLE 是唯一有效的事务级别
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多