2011-03-14 100 views
0

Hy!空指針異常(Derby,JDBC)

我的錯誤代碼:

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

數據庫: Database

請幫助

+1

你能指出哪一行是第39行嗎?所以我們可以確切地知道哪一行會引發異常。 – 2011-03-14 20:33:05

+0

固定............. – user547995 2011-03-14 20:37:43

+0

什麼是dbconn? – skaffman 2011-03-14 20:38:08

回答

2

這是非常糟糕的(TM):

public DBConnection() { 
    try 
    { 
     conn = DriverManager.getConnection(this.url, "test", "test"); 
     st = conn.createStatement(); 

    } 
    catch (SQLException ex) 
    { 
     System.out.print("SQL EXCEPTION"); 
    } 
} 

漁獲物和忽視這樣的例外。有一個很有好理由。在這種情況下,如果您的構造函數由於異常而失敗,則整個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領域。這給你一個編譯時保證東西將被分配給這些字段。

+1

這樣一個'DBConnection'設置的另一個不好的地方是連接不能從外部關閉,因此非常容易發生資源泄露。我把它扔掉了,只需要在查詢需要執行的同一個'try'塊中獲取連接/語句。僅在最高處重構'getConnection()'調用。這使您能夠在'finally'塊中正確關閉它們。 – BalusC 2011-03-14 21:18:43

0

請檢查dbconn.getSt()未返回null 無論如何, getSt()是什麼;類似 createStatement()現在我看到了您的編輯,您的DBConn類很可能在調用createStatement()時不成功。

0

現在還不能完全測試,但我會申請讓您的DBConnection.getSt()方法返回一個全新的Statement對象,而不是一遍又一遍地重複使用同一個對象。會是這樣的:

public Statement getSt() { 
    return conn.createStatement(); 
} 

請記住在使用它後關閉您的語句。