1. 程式人生 > >org.apache.catalina.core.StandardWrapperValve invoke的解決辦法

org.apache.catalina.core.StandardWrapperValve invoke的解決辦法

故障碼:

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語句,比如說進行新增、修改、刪除等操作後就自動跳轉到新頁面進行查詢,整個過程是自動的,此時就有可能存在引數丟失的情況,所以說在這裡也經常會出現該錯誤。

總之,出現該錯誤的地方往往是連線的環節,在關閉連線之前一定要判斷連線是否已關閉再執行關閉連線操作,在連線呼叫之前也要判斷連線的東西是否存在。