我有一个方法......我找不到错误:
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)
答案 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的原因。