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

下面是改正后的代码:

/* 
     * 关闭方法 
     * */  
    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语句,比如说进行添加、修改、删除等操作后就自动跳转到新页面进行查询,整个过程是自动的,此时就有可能存在参数丢失的情况,所以说在这里也经常会出现该错误。

总之,出现该错误的地方往往是连接的环节,在关闭连接之前一定要判断连接是否已关闭再执行关闭连接操作,在连接调用之前也要判断连接的东西是否存在。

经验分享 程序员 微信小程序 职场和发展