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;
    }
}