在jsp中,用ArrayList在多次刷新页面出现NullPointerExcection的问题,困扰我多日的问题 出错信息,这种情况的出现是我在浏览器上按F5键50多秒来重复刷新出现的,错误如下;java.lang.NullPointerException 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 检查代码 应该是ArrayList里边为null 才这样 hcqhappy(月坏) 说的对!<%!purview pru = new purview();ArrayList alYN;int no;//栏目标识int YN7 = 0;//删除权限String QX_a = "";//根据userid,user_lm传出本栏目权限%>中的ArrayList alYN需要初始化一下,改为:ArrayList alYN = new ArrayList(); 我觉得你的代码很怪,purview.java中的成员函数还要创建引用自己类的实例。没有看到所有代码,至少觉得这里有点问题:purview pru = new purview();放到了循环中。如下面的代码:purview.java(再次我只写其中的一个方法) public ArrayList getAllLM(int userid) { String sql = "select user_lm from rwm where userid = "+userid+""; ArrayList al = null; purview pru = new purview(); try{ RS= Stmt.executeQuery(sql); while(RS.next()) { pru = new purview(); pru.setLmTag(RS.getInt("user_lm")); pru.setLmName(pru.getLMname(RS.getInt("user_lm"))); al.add(pru); } }catch(SQLException e) { System.out.print(e.getMessage()); } return al; } 为什么在一开始时没有出现错误,要连续刷新很多次才会出现呢,楼上的我在javabean里ArrayList已经用ArrayList al = new ArrayList();声明了阿,应当在用jsp调用时,就算里面没有任何值,也应当不会有问题的八 这种声明是不对的:<%!purview pru = new purview();ArrayList alYN;int no;//栏目标识int YN7 = 0;//删除权限String QX_a = "";//根据userid,user_lm传出本栏目权限%>这样声明相当于在servlet的doGet(),doPost()外面写东西,对一个servlet来说(准确的说是一个url,servlet可以做多种映射的url)只有一个实例,所以你的:ArrayList有时可能是空的,在jsp里除非必要,不要用<%! %>来声明变量,(如果做计数器这种功能的可以,其它的时候不要用) 那就要看你调用什么方法了,如果你调用:al.get(1),为空肯定出错了!用:if(list.isEmpty())判断一下再做可能容易抛错的执行! 代码级问题。么考虑到可能出现的异常。应该看具体哪一行出现的问题?加上try...catch...再try 异常肯定在pru.getAllLM()的执行过程中,遇到了问题。 下面的代码抛出的异常,我已经测试过,关键如何解决alYN = pru.getAllLM(Integer.parseInt(cnlife_user_userid)); 在jsp的<%! %>部分,所有声明的变量应该是只读的,也就是应该声明为final,并且对ArrayList这样的对象不要进行任何写操作(如add,remove等等),否则在执行过程中一定会出问题(这种错误还通常很少出现),因为通常的servlet是多线程执行的,<%! %>部分的代码是在doGet和doPost方法之外的,当多个用户同时执行时,就会产生干扰。在此部分可以声明方法,但不要对<%! %>部分声明的变量进行任何写操作 关联到的问题很多,有可能是数据库连接等等。加入调试信息,你慢慢调.public ArrayList getAllLM(int userid) { //System.out.println("start"); String sql = "select user_lm from rwm where userid = "+userid+""; //System.out.println(1); ArrayList al = null; purview pru = new purview(); //System.out.println(2); try{ RS= Stmt.executeQuery(sql); //System.out.println(3); while(RS.next()) { pru = new purview(); pru.setLmTag(RS.getInt("user_lm")); pru.setLmName(pru.getLMname(RS.getInt("user_lm"))); al.add(pru); } //System.out.println(4); }catch(SQLException e) { System.out.print(e.getMessage()); } catch(Exception ex) { System.out.println("HAHA:"+ex.toString()); } System.out.println("End"); return al; } <%!purview pru = new purview();ArrayList alYN;int no;//栏目标识int YN7 = 0;//删除权限String QX_a = "";//根据userid,user_lm传出本栏目权限%>这段代码错了,线程不安全。你的jsp被引擎编译成servlet后这段代码相当于servlet的公共变量。每次请求jsp时调用的其实就是那个servlet,所以你那ArrayList还是第一次的。记住servlet是多线程的,你的jsp最好别用<%! %>声明变量,把!号去掉吧。你可以参照一下2次编译出的servlet就知道有什么不同了 我原来没有用<%!%>这种形式声明变量,刷新一会就会抛出异常 各位大虾,jquery交替值只有前一个判断作用? javabean和JSP问题搞不定... 有谁知道怎么在JAVA的WEB项目中,生成PDF文件 jsp中文本框怎样自动换行啊? sqlserver 必须指定要从中选择的表? 关于通用分页bean的问题 采用ssh2上传文件异常 求教简单问题 求一个3位整数们最多两位小数位的浮点型正则表达式? 怎样include servlet并且不让整个页面跳转的servlet要跳转的jsp页面 各位老大,帮帮忙!!! 怎样import一个类
ArrayList alYN;
int no;//栏目标识
int YN7 = 0;//删除权限
String QX_a = "";//根据userid,user_lm传出本栏目权限
%>
中的ArrayList alYN需要初始化一下,改为:ArrayList alYN = new ArrayList();
purview pru = new purview();
放到了循环中。如下面的代码:purview.java(再次我只写其中的一个方法)
public ArrayList getAllLM(int userid)
{
String sql = "select user_lm from rwm where userid = "+userid+"";
ArrayList al = null;
purview pru = new purview();
try{
RS= Stmt.executeQuery(sql);
while(RS.next())
{
pru = new purview();
pru.setLmTag(RS.getInt("user_lm"));
pru.setLmName(pru.getLMname(RS.getInt("user_lm")));
al.add(pru);
}
}catch(SQLException e)
{
System.out.print(e.getMessage());
}
return al;
}
楼上的我在javabean里ArrayList已经用ArrayList al = new ArrayList();声明了阿,应当在用jsp调用时,就算里面没有任何值,也应当不会有问题的八
<%!purview pru = new purview();
ArrayList alYN;
int no;//栏目标识
int YN7 = 0;//删除权限
String QX_a = "";//根据userid,user_lm传出本栏目权限
%>
这样声明相当于在servlet的doGet(),doPost()外面写东西,
对一个servlet来说(准确的说是一个url,servlet可以做多种映射的url)只有一个实例,所以你的:ArrayList有时可能是空的,
在jsp里除非必要,不要用<%! %>来声明变量,(如果做计数器这种功能的可以,其它的时候不要用)
应该看具体哪一行出现的问题?加上try...catch...再try
alYN = pru.getAllLM(Integer.parseInt(cnlife_user_userid));
在此部分可以声明方法,但不要对<%! %>部分声明的变量进行任何写操作
加入调试信息,你慢慢调.
public ArrayList getAllLM(int userid)
{
//System.out.println("start");
String sql = "select user_lm from rwm where userid = "+userid+"";
//System.out.println(1);
ArrayList al = null;
purview pru = new purview();
//System.out.println(2);
try{
RS= Stmt.executeQuery(sql);
//System.out.println(3); while(RS.next())
{
pru = new purview();
pru.setLmTag(RS.getInt("user_lm"));
pru.setLmName(pru.getLMname(RS.getInt("user_lm")));
al.add(pru);
}
//System.out.println(4); }catch(SQLException e)
{
System.out.print(e.getMessage());
}
catch(Exception ex)
{
System.out.println("HAHA:"+ex.toString());
}
System.out.println("End");
return al;
}
purview pru = new purview();
ArrayList alYN;
int no;//栏目标识
int YN7 = 0;//删除权限
String QX_a = "";//根据userid,user_lm传出本栏目权限
%>
这段代码错了,线程不安全。你的jsp被引擎编译成servlet后这段代码相当于servlet的公共变量。
每次请求jsp时调用的其实就是那个servlet,所以你那ArrayList还是第一次的。
记住servlet是多线程的,你的jsp最好别用<%! %>声明变量,把!号去掉吧。
你可以参照一下2次编译出的servlet就知道有什么不同了