在jsp中,用ArrayList在多次刷新页面出现NullPointerExcection的问题,困扰我多日的问题

CNSDYT 2004-12-22 01:54:23
举个例子吧,如下方:
在下面的例子中跑出异常的就是alYN = pru.getAllLM(Integer.parseInt(cnlife_user_userid));这条语句,那么在jsp文件里如何正确的运用ArrayList这个类呢?
jsp.jsp(jsp文件)
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>

<%@ page import="javaclass.javabean.purview.purview" %>
<%!

purview pru = new purview();
ArrayList alYN;
int no;//栏目标识
int YN7 = 0;//删除权限
String QX_a = "";//根据userid,user_lm传出本栏目权限
%>
<%

String dt = request.getParameter("delTag2");

String cnlife_user_userid = (String)session.getAttribute("cnlife_logon_userid");
if(cnlife_user_userid == null || cnlife_user_userid.length()<8){
response.sendRedirect("../../logon.jsp");
}

%>
<%
alYN = pru.getAllLM(Integer.parseInt(cnlife_user_userid));//得到该用户是否是管理员
%>


purview.java(再次我只写其中的一个方法)
public ArrayList getAllLM(int userid)
{
String sql = "select user_lm from rwm where userid = "+userid+"";

ArrayList al = new ArrayList();
purview pru = new purview();
try{
RS= Stmt.executeQuery(sql);
while(RS.next())
{

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;
}
...全文
224 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CNSDYT 2004-12-24
  • 打赏
  • 举报
回复
唉这个问题我提了两次了,还是没有能够解决,还是要感谢大家的
CNSDYT 2004-12-23
  • 打赏
  • 举报
回复
我原来没有用<%!%>这种形式声明变量,刷新一会就会抛出异常
wwwer1 2004-12-22
  • 打赏
  • 举报
回复
<%!
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就知道有什么不同了
junyi2003 2004-12-22
  • 打赏
  • 举报
回复
关联到的问题很多,有可能是数据库连接等等。
加入调试信息,你慢慢调.
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;
}
flyxxxxx 2004-12-22
  • 打赏
  • 举报
回复
在jsp的<%! %>部分,所有声明的变量应该是只读的,也就是应该声明为final,并且对ArrayList这样的对象不要进行任何写操作(如add,remove等等),否则在执行过程中一定会出问题(这种错误还通常很少出现),因为通常的servlet是多线程执行的,<%! %>部分的代码是在doGet和doPost方法之外的,当多个用户同时执行时,就会产生干扰。
在此部分可以声明方法,但不要对<%! %>部分声明的变量进行任何写操作
CNSDYT 2004-12-22
  • 打赏
  • 举报
回复
下面的代码抛出的异常,我已经测试过,关键如何解决
alYN = pru.getAllLM(Integer.parseInt(cnlife_user_userid));
junyi2003 2004-12-22
  • 打赏
  • 举报
回复
异常肯定在pru.getAllLM()的执行过程中,遇到了问题。
junyi2003 2004-12-22
  • 打赏
  • 举报
回复
代码级问题。么考虑到可能出现的异常。
应该看具体哪一行出现的问题?加上try...catch...再try
pgztdk 2004-12-22
  • 打赏
  • 举报
回复
刷50多秒才出现的?还是重刷一次就出现的?
idea_stuats 2004-12-22
  • 打赏
  • 举报
回复
那就要看你调用什么方法了,如果你调用:al.get(1),为空肯定出错了!用:if(list.isEmpty())判断一下再做可能容易抛错的执行!
eureka0891 2004-12-22
  • 打赏
  • 举报
回复
这种声明是不对的:
<%!

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里除非必要,不要用<%! %>来声明变量,(如果做计数器这种功能的可以,其它的时候不要用)
CNSDYT 2004-12-22
  • 打赏
  • 举报
回复
为什么在一开始时没有出现错误,要连续刷新很多次才会出现呢,
楼上的我在javabean里ArrayList已经用ArrayList al = new ArrayList();声明了阿,应当在用jsp调用时,就算里面没有任何值,也应当不会有问题的八
虎叔 2004-12-22
  • 打赏
  • 举报
回复
我觉得你的代码很怪,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;
}

idea_stuats 2004-12-22
  • 打赏
  • 举报
回复
hcqhappy(月坏) 说的对!<%!

purview pru = new purview();
ArrayList alYN;
int no;//栏目标识
int YN7 = 0;//删除权限
String QX_a = "";//根据userid,user_lm传出本栏目权限
%>
中的ArrayList alYN需要初始化一下,改为:ArrayList alYN = new ArrayList();
hcqhappy 2004-12-22
  • 打赏
  • 举报
回复
检查代码 应该是ArrayList里边为null 才这样
CNSDYT 2004-12-22
  • 打赏
  • 举报
回复
出错信息,这种情况的出现是我在浏览器上按F5键50多秒来重复刷新出现的,错误如下;
java.lang.NullPointerException

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧