2014-10-30 177 views
-1

error: java.lang.NullPointerException,是什麼原因?如何執行SQL語句?

我的班級名字是; DP.java

public static TPreparedStatement Fill(SessionStruct ss, 
     String seq) throws SQLException { 
    TPreparedStatement tp = null; 

    try { 

     String sql = "Select name,surname from NAMES where seq=? "; 

     tp = new TPreparedStatement(ss, sql); 
     tp.setString(1, seq); 
     tp.executeQuery(); 
     tp.close(); 
    } catch (SQLException ex) { 
     tp.close(); 
     ss.rollbackNoException(); 
     ex.printStackTrace(); 
     throw ex; 
    } 
    return tp; 

} 

另一類是; DLP.java

public void Load() throws HException { 
    TPreparedStatement tp = null; 
    try { 
     tp = DP.Fill(rc.ss, rc.getRequest() 
       .getParameter("PK")); 

     txtName.setValue(tp.getString("NAME"));  
     txtSurname.setValue(tp.getString("SURNAME")); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
     rc.ss.rollbackNoException(); 
    } 
} 

當我在調試模式下運行時,它跳過了;

txtName.setValue(tp.getString("NAME"));  
txtSurname.setValue(tp.getString("SURNAME")); 
+3

這不是一個pl-sql程序。 – NewUser 2014-10-30 13:34:12

+1

我認爲,nullpointer異常帶有它發生的行號?瞭解NPE發生的路線將幫助我們幫助你。 – fvu 2014-10-30 13:37:57

+0

這是WSO2的TPreparedStatement嗎?如果是這樣,你沒有正確使用它 - executeQuery返回一個ResultSet。時間挖掘我認爲的文件... – fvu 2014-10-30 13:46:17

回答

1

只是一個瘋狂的猜測,因爲我們顯然缺乏這裏的一些信息。無論如何:

您在從Fill返回之前認真地關閉了您的TPreparedStatment。然後,在調用者,調用上封閉的聲明方法:

public static TPreparedStatement Fill(SessionStruct ss, 
     String seq) throws SQLException { 
    TPreparedStatement tp = null; 

    try { 
     ... 
     tp.close(); // <-------------- 
    } catch (SQLException ex) { 
     tp.close(); // <-------------- 
     ... 
    } 
    return tp; 
} 
tp = DP.Fill(rc.ss, rc.getRequest() 
      .getParameter("PK")); 

    txtName.setValue(tp.getString("NAME")); 
    //    ^^ 
    //   closed ! 

我不能保證這導致NullPointerException。但通常不建議在關閉的對象上調用任何方法,因爲根據usual semantic,在對象上調用close應放棄任何基礎資源。

0

我會用一個finally塊來關閉你的tp資源。 也可能有助於查看完整的堆棧跟蹤來調查空指針。

try { 
    String sql = "Select name,surname from NAMES where seq=? "; 

    tp = new TPreparedStatement(ss, sql); 
    tp.setString(1, seq); 
    tp.executeQuery(); 
} catch (SQLException ex) { 
    ss.rollbackNoException(); 
    ex.printStackTrace(); 
    throw ex; 
} finally { 
    tp.close(); 
} 
0

感謝所有..

右鍵我卻忘記 - > tp.close();像這樣的陳述;

嘗試{ ... tp.close(); // < -------------- } catch(SQLException ex){ tp.close(); // < -------------- ... } return tp;