【问题标题】:NullpointerException with connection object creating SQL statementNullpointerException 与连接对象创建 SQL 语句
【发布时间】:2012-12-10 20:16:50
【问题描述】:

这行代码我得到了一个空指针异常

Statement stmt = conn.createStatement();

几天前使用它的 servlet 工作正常,我从我的存储库中恢复了我的类的先前版本,但它仍然无法正常工作,所以我猜这可能是服务器端问题。

但是为了确保我想获得尽可能多的信息,最好的调试方法是什么。

我尝试过使用

 e.toString() 

但是这只会给出“nullpointerexception”消息。

堆栈跟踪

  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: java.lang.NullPointerException
  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: at org.ari.DatabaseLogic.getData(DatabaseLogic.java:80)
  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: at org.ari.ARIServlet.doPost(ARIServlet.java:72)
  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: at javax.servlet.http.HttpServlet.service(HttpServlet.java:807)
  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: at javax.servlet.http.HttpServlet.service(HttpServlet.java:908)
  • [24/Dec/2012:11:59:24] 警告 (27454): CORE3283: stderr: at org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771)

数据库逻辑类

    public class DatabaseLogic
{
    private static Connection conn;

    public static void 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

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


    // queryId is the parameter to be used for querying for relevant records
    public static String getData(String queryId, int requestNumber)
            throws SQLException
    {
        String result = "";
        if (queryId != null)
        {
            try
            {
                // prepare a statement for use in query
                result = "This code breaks at this point";
                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;
    }

}

我在我的网络服务器上设置了一个连接池,它正在运行。

还有其他想法或建议吗?

谢谢

圣诞快乐,节日快乐!

【问题讨论】:

  • 这个 JNDI jdbc/POOL 是否可用,我希望程序无法找到 JNDI,这就是你可能会得到 NPE 的原因
  • @PradeepSimha ;我有一个 jdbc 池和 JNDI 设置。有没有办法确认这一点
  • 我认为您面临以下答案所说的问题。检查是否有效。
  • 到目前为止,没有一个评论者/回答者发现代码中出现严重线程安全和资源泄漏问题,这让我感到非常遗憾。此代码在多用户环境(例如 Web 应用程序)中是一场灾难。要了解有关您的错误的更多信息,请从这里开始:stackoverflow.com/questions/9428573/…

标签: java servlets jdbc nullpointerexception


【解决方案1】:

您是在拨打getData 之前先拨打openDatabase 吗?

如果不是,那么connnullconn.createStatement 将触发空指针异常

【讨论】:

  • conn = ds.getConnection();
  • 在我的主课中是的 - public void init() { try { DatabaseLogic.openDatabase(); } 捕捉(异常 e){ e.printStackTrace(); } }
  • 好的,openDatabase 设置 conn 对象似乎有问题。
  • 我试过了,还是为空,conn 无法设置有问题。
  • 事实证明我的代码没有任何问题,我错误配置了 JDBC 池,d'oh :(
【解决方案2】:

试试

如果 (conn == NULL) { 打开数据库(); }

就在您的 createStatement 之前

【讨论】:

  • 好的,我使用了你的代码,确实 conn 是 NULL 但是我的 openDatabase 似乎由于某种原因没有设置它,可能是因为它是一个静态变量吗?
猜你喜欢
  • 2012-02-13
  • 2014-11-29
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多