org.apache.catalina.core.StandardWrapperValve invoke的解決辦法
阿新 • • 發佈:2018-12-23
故障碼:
Servlet.service() for servlet servletAction threw exception java.lang.NullPointerException at com.dbdao.mysql.mySqlConnection.getClose(mySqlConnection.java:173) at com.service.stuInfoService.delete(stuInfoService.java:109) at com.action.servletAction.delete(servletAction.java:374) at com.action.servletAction.doPost(servletAction.java:79)
網上查詢的解決辦法:
1.servlet或jsp中,重複呼叫response的 getOutputStream(),response.getWriter()方法。
2.form表單裡沒有 method="post" action=""引數。
3.看JDBC操縱資料庫的程式碼,仔細看,例如呼叫的物件的屬性為null。
Connection conn=null; 之後之就呼叫了conn的方法。
以上三點我發現寫的太籠統,容易讓人摸不著頭腦,不過經過查詢,我終於發現自己程式碼的錯誤的地方了,原來是關閉資料庫的連線沒經過判斷,直接就關閉了,這是我的故障原始碼,現我將其貼出。
錯誤原始碼:
public void getClose() { // TODO Auto-generated method stub //關閉結果集 try { //結果集關閉方法 rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //關閉宣告的sql語句 try { //關閉宣告的sql語句方法 pstmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //解除安裝驅動 try { //驅動解除安裝方法 con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
這知道,雖然在JavaWeb中報錯很明顯,直接以錯誤頁面的形式滿屏顯示,但是在Java專案中則並不明顯,比如說我一直用junit進行程式程式碼測試,由於我關注的焦點在控制檯,控制檯中的內容完全按照我寫的程式碼在執行,而junit的報錯卻偏偏容易被忽略,因為自己的程式只寫了一部分,不全很正常,而junit又恰恰只是測試了這不全程式碼的可執行的一部分,所以說這裡的報錯往往很難被注意到。
下面是改正後的程式碼:
/*
* 關閉方法
* */
public void getClose() {
// TODO Auto-generated method stub
//關閉結果集
try {
//結果集關閉方法
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//關閉宣告的sql語句
try {
//關閉宣告的sql語句方法
if(pstmt!=null){
pstmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//解除安裝驅動
try {
//驅動解除安裝方法
if(con!=null){
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
還有比較容易錯的地方是頁面帶引數進行跳轉,由於跳轉之後的頁面本身也要執行一部分sql語句,比如說進行新增、修改、刪除等操作後就自動跳轉到新頁面進行查詢,整個過程是自動的,此時就有可能存在引數丟失的情況,所以說在這裡也經常會出現該錯誤。
總之,出現該錯誤的地方往往是連線的環節,在關閉連線之前一定要判斷連線是否已關閉再執行關閉連線操作,在連線呼叫之前也要判斷連線的東西是否存在。