【问题标题】:Why am I getting a Null Pointer Exception from this Java code? [closed]为什么我会从此 Java 代码中得到空指针异常? [关闭]
【发布时间】:2009-06-21 12:56:11
【问题描述】:

我有一个方法...找不到错误:

    public String getUsernameforID(int id) {
    String statment = "SELECT USERNAME  FROM `BENUTZER` WHERE `ID` = ? ;";
    String username = null;
    try {
        PreparedStatement ps = dbCommunicator.getStatment(statment);  // HERE : NULL POINTER EXECTION
        ps.setInt(1, id);
        ResultSet rs = dbCommunicator.readFromDB(ps);

        if (rs.first()) {
            username = rs.getString("USERNAME");
        }
    } catch (SQLException ex) {
        Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
    }
    return username;

我认为这是声明......但我怎样才能找到它? 我得到一个空指针异常。

编辑: 我的 getStatment 方法:

    public PreparedStatement getStatment(String st) {
    connect();
    PreparedStatement ps = null;
    try {
        ps = (PreparedStatement) connection.prepareStatement(st);
    } catch (SQLException ex) {
        Logger.getLogger(DBCommunicator.class.getName()).log(Level.SEVERE, null, ex);
    }
    return ps;
    }

例外:

Exception in thread "main" java.lang.NullPointerException
    at test.DBCommunicator.getStatment(DBCommunicator.java:107)
    at test.database.DBManager.getUsernameforID(DBManager.java:359)
    at dbtestdrive.Main.main(Main.java:25)

【问题讨论】:

  • NullPointerException.. 在哪里?
  • 另附原始异常
  • 投票关闭为“不再相关”。
  • NPE 源自 getStatement() 可能连接为空。也许在 conenct() 中有些东西会默默地失败?

标签: java jdbc


【解决方案1】:

虽然这个问题可能已经解决了,但这里有一点关于如何在给定堆栈跟踪的情况下进行调试。

在这种情况下,堆栈跟踪如下:

Exception in thread "main" java.lang.NullPointerException
    at test.DBCommunicator.getStatment(DBCommunicator.java:107)
    at test.database.DBManager.getUsernameforID(DBManager.java:359)
    at dbtestdrive.Main.main(Main.java:25)

这表明在test.DBCommunicator.getStatment方法中,NullPointerException被抛出在DBCommunicator.java的第107行位置。

此外,getStatment 方法是从 DBManager.java 的第 358 行调用的,它在 DBManager.getUsernameforID 方法中。

因此,首先应该检查的是DBCommunicator.java 的第 107 行发生了什么。

虽然在给定的代码 sn-p 中没有行号,但可以假定 NullPointerException 出现在以下行中:

ps = (PreparedStatement) connection.prepareStatement(st);

关于NullPointerExceptions 有一件相当普遍的事情——它们通常在对null 引用执行方法调用时出现。对不存在的对象调用方法将抛出 NullPointerException

在上面的代码中,可以预期connection 变量实际上是null,而不是Connection

这应该会导致尝试追查为什么connection 变量是null,而不是与已初始化的数据库建立有效连接。

【讨论】:

    【解决方案2】:

    这可能是因为您的查询失败,请尝试将其更改为:

    String statment = "SELECT USERNAME  FROM `BENUTZER` WHERE `ID` = ?";
    

    您的原始查询有一个尾随分号,这是非法的。这可能会导致稍后抛出空指针异常,我建议您发布异常的内容。

    编辑:

    dbCommunicator.getStatment(statment);
    

    应该是:

    dbCommunicator.getStatement(statment);
    

    您将 'statement' 拼写为 'statment',这对于变量名来说很好,但在引用方法时则不然:)

    【讨论】:

    • 不..这不是问题:(
    • 所以粘贴你的异常,或者至少是抛出它的行号
    • 不幸的是它不是错误:S
    【解决方案3】:
    //Ending ";" inside the string, is not neccessary.
    String statment = "SELECT USERNAME  FROM `BENUTZER` WHERE `ID` = ? ;";
    

    代替:

    PreparedStatement ps = dbCommunicator.getStatment(statment);
    
    PreparedStatement ps = dbCommunicator.prepareStatement(statment);
    

    这就是我使用 oracle 所拥有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2011-12-13
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多