2009-06-21 110 views
1

我有一个方法......,我无法找到错误:为什么我从这个Java代码中得到一个空指针异常?

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) 
+0

哪个db你在用? – Macarse 2009-06-21 13:02:17

+0

我正在使用mySQL – darkrain 2009-06-21 13:09:01

回答

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在的DBCommunicator.java 107线的位置抛出。

另外,getStatment方法从DBManager.java的行358调用,该行在DBManager.getUsernameforID方法中。

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

虽然有代码片段给出代码中没有行号,可以假定一个NullPointerException发生在下面一行:

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

有一两件事是很常见约NullPointerException秒 - 它们通常出现当方法调用在null参考上执行时。在不存在的对象上调用方法将会抛出一个NullPointerException

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

这应该导致尝试追查为什么connection变量是null而不是有一个有效的连接到初始化的数据库。

1

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

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

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

编辑:

dbCommunicator.getStatment(statment); 

应该是:

dbCommunicator.getStatement(statment); 

提到的方法,当你的拼写错误 '声明' 作为 'statment',这是罚款变量名,但不:)

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。

相关问题