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

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

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方法:

  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) 

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

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

 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方法中,在test.DBCommunicator.getStatment的第107行的位置抛出了NullPointerException

此外,从DBManager.java第358行调用getStatment方法,该方法位于DBManager.getUsernameforID方法中。

因此,应该检查的第一个位置是DBCommunicator.java第107行的DBCommunicator.java

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

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

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

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

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

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

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

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

编辑:

 dbCommunicator.getStatment(statment); 

应该:

 dbCommunicator.getStatement(statment); 

你将’statement’拼错为’statment’,这对于变量名称来说很好,但在引用方法时却没有:)

 //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的东西。