一个困扰了我一个多月的问题,关于空指针的。。。请教各位老大。。。

问题描述

Stacktrace:org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)root cause java.lang.NullPointerExceptionservlet.CountIPShw.doPost(CountIPShw.java:110)servlet.CountIPShw.doGet(CountIPShw.java:50)javax.servlet.http.HttpServlet.service(HttpServlet.java:617)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)org.apache.jsp.mng.ipcount_jsp._jspService(ipcount_jsp.java:90)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)servlet.CountIPShw.doPost(CountIPShw.java:110)代码如下:ExecuteDB exedb = new ExecuteDB();ResultSet rs1 = exedb.exeQuery("select count(*) from ip where date != ""+date+"";");ResultSet rs2 = exedb.exeQuery("select * from visit;");ResultSet rs3 = exedb.exeQuery("select count(*) from ip where date = ""+date+"";");try {if(rs1.next()&&rs2.next()){//这是第110行if(rs1.getString(1)!=null&&!rs1.getString(1).equals("")){amount = rs1.getInt(1)+rs2.getInt(1);exedb.exeSql("update visit set amount = "+amount);exedb.exeSql("delete from ip where date != ""+date+"";");}}rs1.close();rs2.close();if(rs3.next()){if(rs3.getString(1)!=null&&!rs3.getString(1).equals(""))today = rs3.getInt(1);}rs3.close();} catch (SQLException e) {}exedb.close();这里的ExecuteDB 类代码如下:package newshop;import java.sql.*;public class ExecuteDB{private String userName="****";private String userPassword="****";private String url="jdbc:mysql://127.0.0.1:3306/****";private Connection dbConn;private Statement stmt;private ResultSet rs; private String errMes; public ExecuteDB(){dbConn = this.getConn();stmt = null;rs = null;this.errMes = this.getErrMes();} public Connection getConn() { try { Class.forName("org.gjt.mm.mysql.Driver").newInstance();dbConn= DriverManager.getConnection(url,userName,userPassword); } catch(Exception e) { dbConn = null; errMes=e.toString(); }finally{ } return dbConn; } public boolean exeSql(String strSql){boolean isSuc = false;try{ stmt=dbConn.createStatement();stmt.executeUpdate(strSql);isSuc = true; }catch(Exception e){this.errMes = this.errMes + "<br>" +e.toString();}finally{}return isSuc;} public ResultSet exeQuery(String strSql){try{ stmt=dbConn.createStatement();rs =stmt.executeQuery(strSql);}catch(Exception e){ this.errMes = this.errMes + "<br>" +e.toString();rs = null;}finally{}return rs;} public void close() { try { stmt.close(); dbConn.close(); } catch (SQLException e) { this.errMes = this.errMes + "<br>" +e.toString(); } } public String getErrMes() { return errMes; }} 问题补充:Stacktrace:org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)root cause java.lang.NullPointerExceptionservlet.CountIPShw.doPost(CountIPShw.java:110)servlet.CountIPShw.doGet(CountIPShw.java:50)javax.servlet.http.HttpServlet.service(HttpServlet.java:617)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)org.apache.jsp.mng.ipcount_jsp._jspService(ipcount_jsp.java:90)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)servlet.CountIPShw.doPost(CountIPShw.java:110)代码如下:ExecuteDB exedb = new ExecuteDB();ResultSet rs1 = exedb.exeQuery("select count(*) from ip where date != ""+date+"";");ResultSet rs2 = exedb.exeQuery("select * from visit;");ResultSet rs3 = exedb.exeQuery("select count(*) from ip where date = ""+date+"";");try {if(rs1.next()&&rs2.next()){//这是第110行if(rs1.getString(1)!=null&&!rs1.getString(1).equals("")){amount = rs1.getInt(1)+rs2.getInt(1);exedb.exeSql("update visit set amount = "+amount);exedb.exeSql("delete from ip where date != ""+date+"";");}}rs1.close();rs2.close();if(rs3.next()){if(rs3.getString(1)!=null&&!rs3.getString(1).equals(""))today = rs3.getInt(1);}rs3.close();} catch (SQLException e) {}exedb.close();这里的ExecuteDB 类代码如下:package newshop;import java.sql.*;public class ExecuteDB{private String userName="****";private String userPassword="****";private String url="jdbc:mysql://127.0.0.1:3306/****";private Connection dbConn;private Statement stmt;private ResultSet rs; private String errMes; public ExecuteDB(){dbConn = this.getConn();stmt = null;rs = null;this.errMes = this.getErrMes();} public Connection getConn() { try { Class.forName("org.gjt.mm.mysql.Driver").newInstance();dbConn= DriverManager.getConnection(url,userName,userPassword); } catch(Exception e) { dbConn = null; errMes=e.toString(); }finally{ } return dbConn; } public boolean exeSql(String strSql){boolean isSuc = false;try{ stmt=dbConn.createStatement();stmt.executeUpdate(strSql);isSuc = true; }catch(Exception e){this.errMes = this.errMes + "<br>" +e.toString();}finally{}return isSuc;} public ResultSet exeQuery(String strSql){try{ stmt=dbConn.createStatement();rs =stmt.executeQuery(strSql);}catch(Exception e){ this.errMes = this.errMes + "<br>" +e.toString();rs = null;}finally{}return rs;} public void close() { try { stmt.close(); dbConn.close(); } catch (SQLException e) { this.errMes = this.errMes + "<br>" +e.toString(); } } public String getErrMes() { return errMes; }}

解决方案

你是在程序中对于每个请求自己创建连接,当请求比较多的时候,连接就不够用了。而且,你在doPost()里面,当有异常的时候,也没有关闭数据库连接,只有正常结束的情况下才关闭。一般数据库连接都是有限制的,你这样自己创建连接肯定不行,当并发请求比较多的时候,数据库就会连接不上,那你执行sql的时候就肯定会出错了。你的代码还有一个很大的问题,java里面处理异常,你不能吞了它,而应该把它重新扔出来,最后在doPost之类的方法里面统一处理。在你的代码里,getConn() 方法,已经exeQuery()方法里面的异常你都只是记录,但是没有抛出来,这样,程序出错的时候是空指针,但是实际上错误是在一开始创建连接的时候。就会误导你debug。建议使用一些DAO框架,像iBatis、Hibernate之类的,可以提供数据库连接池。
解决方案二:
引用if(rs1.next()&&rs2.next()){//这是第110行 简单的看了一下代码,显然rs1或者rs2当中有一个为null.再看实现:public ResultSet exeQuery(String strSql){try{ stmt=dbConn.createStatement(); rs =stmt.executeQuery(strSql);}catch(Exception e){ this.errMes = this.errMes + "<br>" +e.toString(); rs = null;}finally{}return rs;} 这里rs不能是共享成员变量应该改为:public ResultSet exeQuery(String strSql){ ResultSet rset = null;try{ stmt=dbConn.createStatement(); rset =stmt.executeQuery(strSql);}catch(Exception e){ this.errMes = this.errMes + "<br>" +e.toString();}finally{}return rset;}再把if(rs1.next()&&rs2.next())判断条件多加两个if (rs1!=null && rs1.next() && rs2!=null && rs2.next())这样才有效果。
解决方案三:
睡觉 了,明天 有时间 再看了
解决方案四:
而且你这代码里在RS.NEXT偱环里还有exedb.exeSql("update visit set amount = "+amount); 这些操作在这些操作里STMT又重新赋值产生了变化 ,也就有可能导致RS变空感觉这代码有点乱.....
解决方案五:
你把这个public ResultSet exeQuery(String strSql) {try { stmt=dbConn.createStatement(); rs =stmt.executeQuery(strSql);} catch(Exception e) { this.errMes = this.errMes + "<br>" +e.toString();rs = null; }finally{ } return rs; } 改成public ResultSet exeQuery(String strSql) {try { stmt=dbConn.createStatement(); return stmt.executeQuery(strSql);} catch(Exception e) { this.errMes = this.errMes + "<br>" +e.toString();}finally{ } } 不要把查询结果赋给RS再返回了,这样的话你的三个RS就变成同一个了,直接把结果 返回
解决方案六:
你把刚才 改的代码再替回来吧,可能我记错了,那样初始化也不可以(不过你这样取数据库连接还是会造成混乱,链接也有可能没法及时释放 等 问题)ExecuteDB exedb = new ExecuteDB(); ResultSet rs1 = exedb.exeQuery("select count(*) from ip where date != ""+date+"";"); ResultSet rs2 = exedb.exeQuery("select * from visit;"); ResultSet rs3 = exedb.exeQuery("select count(*) from ip where date = ""+date+"";"); 这段代码三个RS感觉是同一个,因为你只声明了一个exedb
解决方案七:
你能断点调试看看是改后的哪一行出错吗?
解决方案八:
这个就得对JAVA对像初始化的执行顺序 要有一定的了解了
解决方案九:
你先试一下看看结果
解决方案十:
但是这样也不合适,将来数据库链接会不及时释放
解决方案十一:
代码 初始化的时候 不能这样写吧dbConn = this.getConn(); 你试一下把public ExecuteDB() { dbConn = this.getConn(); stmt = null; rs = null;this.errMes = this.getErrMes();} 改成public ExecuteDB() { try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); dbConn= DriverManager.getConnection(url,userName,userPassword); } catch(Exception e) { dbConn = null; errMes=e.toString(); }finally{ } stmt = null; rs = null}
解决方案十二:
servlet.CountIPShw.doPost(CountIPShw.java:110)代码如下: 这里提示的110行是哪一行

时间: 2024-09-20 01:14:27

一个困扰了我一个多月的问题,关于空指针的。。。请教各位老大。。。的相关文章

请教一个困扰了我3个月的问题!

问题描述 为什么我写的代码在IE8和ff上运行正常.但是在IE6下就莫名其妙经常会卡在加载js文件的地方.页面代码如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//

html-用javascript如何实现设置一个任意时间(20xx年xx月xx日xx时xx分xx秒),并按照这个时间走下去?

问题描述 用javascript如何实现设置一个任意时间(20xx年xx月xx日xx时xx分xx秒),并按照这个时间走下去? 用javascript如何实现设置一个任意时间(20xx年xx月xx日xx时xx分xx秒),并按照这个时间走下去? 帮助文档里只有setFullYear(19xx,xx,xx)这个方法,可是十分秒该如何设置,并实现精准的走时.(图片是获取当前时间的程序),新手求思路.计算器"> 解决方案 先求出指定时间和当前时间的差,然后每隔一秒获取一下当前时间,然后显示的时候把这

关键词密度一直都是一个困扰部分seoer的问题

摘要: 关键词密度一直都是一个困扰部分seoer的问题.做太多又怕惩罚,太少又怕关键词不够不够精准,其实大部分人低估了百度和谷歌的技术.目前市面上告诉大家的什么保持在2%-8%以内就行 关键词密度一直都是一个困扰部分seoer的问题.做太多又怕惩罚,太少又怕关键词不够不够精准,其实大部分人低估了百度和谷歌的技术.目前市面上告诉大家的什么保持在2%-8%以内就行.其实这些都已经是没必要的了.只要把网站内部结构和链接还有外链做好,神马密度都是浮云,虽然说seo做的就是极致.就是细节,但是我认为zac

紧急求助!一个困扰了我很久的问题了!关于程序配置

问题描述 我搞ASP.NET算是业余爱好吧当然也上过这门课制作网站的基本功和各种控件的使用也都还可以但是现在有一个困扰很久的问题比如说VS2005+自带的SQL2005建站的一个配置程序,可以自动提供成员管理功能,我觉得很方便.但是这样开发出来的程序做好之后怎么在其他机器上运行呢?如果到只有SQL2000的地方呢?还有这种配置实际上用的多不?还是说都是全部自己写成员管理,不用自带的? 解决方案 解决方案二:没有高手知道么?自己顶上去在线等谢谢各位如果知道请一定要告诉我~解决方案三:我一般是还要在

罗永浩:每一个情怀都是一个坑

摘要: 今天下午两点半,罗永浩在北京发布了可能是最后一期一个理想主义者的创业故事的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把锤子科技两年来遇到 今天下午两点半,罗永浩在北京发布了可能是最后一期"一个理想主义者的创业故事"的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把"锤子科技"两年来遇到的为题归因于两点:供应链生产和与媒体关系. 每一个情怀都是一个坑 罗永浩回顾过去半年锤子手机Smartisan T1生产中遇到的

一个大型网站的一个活动栏目的架构选型

问题描述 最近考虑给一个大型网站做一个活动栏目,独立一套系统,低层架构基本上都没有什么问题,不过我个人想在WEB上面搞一点创新和冒险,由于不是很有把握,所以特来请教网上的高人.其实WEB上面也没有什么独特的创新,就是我设想系统反馈的都是XML格式的内容,然后利用XSLT在客户端来传换成传统的html+css.感觉这样搞有以下几个好处: 1,人员的安排上面可以实现较彻底的mvc分离 2,理论上能够提高网站的访问速度 3,系统与系统之间的聚合会更加容易以及直观 4,酷 5,网站语义化 但困扰我的是:

常见问题-android 一个界面调用另一个界面方法,求大神来指点迷津

问题描述 android 一个界面调用另一个界面方法,求大神来指点迷津 我A界面有一个viewpager,里面有个方法,我在B界面也声明viewpager,并初始化A界面的viewpager,调用viewpager方法是直接报错,这个问题困扰我很久了,求大神指点迷津啊 解决方案 http://zhidao.baidu.com/link?url=f6nBkgVSgdi6Z-_29WAN6K1w_pRMgQlgFL0rF01Dljugqsj-x6qQlVQMvU2-3jLjMUdx8Mu-Q-9M7

两款新型Linux恶意软件:一个挖加密货币,一个创建代理网络

俄罗斯反病毒开发商Dr. Web公司的恶意软件研究人员们已经发现了两款新型Linux恶意软件,分别名为Kinux.Muldrop.14和Linux.ProxyM. Kinux.Muldrop.14:主要用于挖掘加密货币 根据Dr. Web公司介绍,Kinux.Muldrop.14的能够感染树莓派(Raspberry Pi)设备以借此实现加密货币挖掘.该恶意软件于今年5月份被首次发现,研究人员们找到了一套包含压缩与加密应用程序的脚本. Kinux.MulDrop.14主要针对具备SSH外部开放端口

CRM:从一个成本中心变成了一个利润中心

今天的呼叫中心已经发生了巨大的演变:从提供售后服务转向售前服务,从一个成本中心变成了一个利润中心,从幕后走向台前. 上周,李小姐出差到杭州,回来后发现自己往返于杭州1586公里的消费里程,记录有误.随即,她就给这家国际航空公司服务中心的服务热线打电话,服务人员让她把登机牌原件和客票复印件,一并邮寄到服务中心. 结果不到一个月,李小姐就收到更正通知,这让李小姐非常满意. 其实,这家国际性航空公司把对会员的服务工作,外包给了贝塔斯曼欧唯特中国服务公司. "像航空公司这样的国际化企业客户,和IT.汽车