Java 空指针异常(Derby、JDBC)
嘿 我的错误代码:Java 空指针异常(Derby、JDBC),java,exception,jdbc,nullpointerexception,derby,Java,Exception,Jdbc,Nullpointerexception,Derby,嘿 我的错误代码: Exception in thread "main" java.lang.NullPointerException at lesebank.Konto.getKontofromID(Konto.java:39) at lesebank.Main.main(Main.java:18) SQL EXCEPTIONJava Result: 1 BUILD SUCCESSFUL (total time: 1 second) 方法: Konto kon
Exception in thread "main" java.lang.NullPointerException
at lesebank.Konto.getKontofromID(Konto.java:39)
at lesebank.Main.main(Main.java:18)
SQL EXCEPTIONJava Result: 1
BUILD SUCCESSFUL (total time: 1 second)
方法:
Konto konto = new Konto ();
Statement s = dbconn.getSt();
try
{ //in the next line the error occurs
s.execute("select id,inhaberin,ktostd,habenzinsen,notiz from Konto where id = " +id);
ResultSet set = s.getResultSet();
if (set.next())
{
konto.setId(set.getInt(1));
konto.setId_inhaberin(set.getInt(2));
konto.setKtostd(set.getDouble(3));
konto.setHabenzinsen(set.getDouble(4));
konto.setNotiz(set.getString(5));
return konto;
}
}
catch (SQLException ex)
{
System.out.print(ex.getMessage());
}
return null;
DBConn:
public class DBConnection {
private String url = "jdbc:derby://localhost:1527/Bank";
private Connection conn;
private Statement st;
public DBConnection() {
try
{
conn = DriverManager.getConnection(this.url, "test", "test");
st = conn.createStatement();
}
catch (SQLException ex)
{
System.out.print("SQL EXCEPTION");
}
}
public Statement getSt() {
return st;
}
数据库:
请帮助请检查
dbconn.getSt()
是否未返回null
。无论如何,什么是getSt()
;类似于createStatement()
的任何内容?现在我看到了您的编辑,很可能您的DBConn类调用createStatement()
时没有成功,现在无法进行测试,但我建议您让您的DBConnection.getSt()
方法返回一个全新的语句对象,而不是反复使用同一个对象。大概是这样的:
public Statement getSt() {
return conn.createStatement();
}
请记住在使用后关闭您的声明。这非常糟糕(tm):
不要捕捉并忽略这样的异常。有一个很好的理由。在这种情况下,如果构造函数由于异常而失败,则整个DbConnection
对象将变得无用,因为st
字段将为空。但是,由于实例化了DbConnection
的代码不知道发生了这种情况,因此您继续使用它,并最终导致空指针异常
如果DbConnection
的构造函数触发异常,则需要将该异常从构造函数中抛出,强制代码处理该异常:
public class DBConnection {
private static final String URL = "jdbc:derby://localhost:1527/Bank";
private final Connection conn;
private final Statement st;
public DBConnection() throws SQLException {
conn = DriverManager.getConnection(URL, "test", "test");
st = conn.createStatement();
}
public Statement getSt() {
return st;
}
}
还要注意
final
字段。这为您提供了编译时保证,可以为这些字段分配一些内容。您能指出哪一行是第39行吗?因此,我们可以准确地判断哪一行引发异常。如果您自己修复了它,并且答案不符合一般人的兴趣,那么请删除该问题。这种DBConnection
设置的另一个缺点是无法从外部关闭连接,因此很容易发生资源泄漏。我会把它全部扔掉,只在需要执行查询的同一个try
块中获取连接/语句。仅在调用getConnection()
时进行最高级别的重构。这使您能够在finally
块中正确关闭它们。
public class DBConnection {
private static final String URL = "jdbc:derby://localhost:1527/Bank";
private final Connection conn;
private final Statement st;
public DBConnection() throws SQLException {
conn = DriverManager.getConnection(URL, "test", "test");
st = conn.createStatement();
}
public Statement getSt() {
return st;
}
}