为什么我从这个Java代码中获得Null Pointer Exception?

时间:2009-06-21 12:56:11

标签: java jdbc

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

    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;

我认为这是声明......但我怎么能找到这个呢? 我得到一个Null Pointer Exeption。

编辑: 我的getStatment-method:

    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)

3 个答案:

答案 0 :(得分:5)

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

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

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第107行的位置投放了DBCommunicator.java

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

因此,应该检查的第一个地方是DBCommunicator.java第107行的内容。

虽然给出的代码段中没有行号,但可以假定在以下行中发生了NullPointerException

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

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

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

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

答案 1 :(得分:1)

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

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

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

编辑:

dbCommunicator.getStatment(statment);

应该是:

dbCommunicator.getStatement(statment);

你错误拼写'声明'为'statment',这对于变量名称是好的,但在引用方法时则不行:)

答案 2 :(得分:0)

//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的原因。