发现在Servlet中调用另外一个类的2个方法后总是会出现NullPointerException,而仅调用其中任意一个方法都不会出现问题,很郁闷
java.lang.NullPointerException
com.inner.model.SalaryBean.addSalary(SalaryBean.java:58)
com.inner.servlet.Salary.doPost(Salary.java:197)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)我的SalaryBean类中有两个方法:
/*
* 发放薪资方法
* @param SalaryFrom
* @return void
*/
public void addSalary(SalaryForm salaryFrom)
{
SalaryForm sf=salaryFrom;
PreparedStatement ps=null;
......
} /*
* 检查同一时期是否已经发放过薪金
* @param uid 用户id
* @param y 年
* @param m 月
* @return int -1为还未发放;1为已经发放过
*/
public int checkSalaryIsDole(int uid,int y,int m)
{
int flag=-1;//初始化为“还未发放”
Statement stmt=null;
.......
return flag;
}Servlet中是这样写的:
String action=(String)request.getParameter("action");
if("add".equals(action))
{
//简单判断
if(request.getParameter("uid")==null ||
"".equals(request.getParameter("uid")) ||
request.getParameter("y")==null ||
"".equals(request.getParameter("y")) ||
request.getParameter("m")==null ||
"".equals(request.getParameter("m")) ||
request.getParameter("money")==null ||
"".equals(request.getParameter("money"))
)
{
out.print("<script>alert('请认真输入相关数据!');history.go(-1);</script>");
return;
}
try
{
//新建SalaryFrom对象
SalaryForm sf=new SalaryForm();
//取得表单值
int uid=Integer.parseInt(request.getParameter("uid"));
double money=Double.parseDouble(request.getParameter("money"));
int y=Integer.parseInt(request.getParameter("y"));
int m=Integer.parseInt(request.getParameter("m"));
String dole_time=(String)request.getParameter("dole_time");
String re=(String)request.getParameter("re");
//开始填充SalaryFrom对象
sf.setUid(uid);
sf.setMoney(money);
sf.setY(y);
sf.setM(m);
sf.setDole_time(dole_time);
sf.setRe(re);
//新建模型层SalaryBean对象
SalaryBean sb=new SalaryBean();
//是否同一时期已发放过薪资标志(1为发放过,-1为未发放)
int flag=sb.checkSalaryIsDole(uid, y, m);
//如果已经发放过该薪资
if(flag>0)
{
out.print("<script>alert('该教工"+y+"年"+m+"月的薪资已经发放过,请勿重复发放!');history.go(-1);</script>");
return;
}
//否则执行发放流程
else
{
sb.addSalary(sf);
out.print("<script>alert('发放成功!');location.href='salary_list.jsp';</script>");
}
}
catch(NumberFormatException e)
{
out.print("<script>alert('金额格式不正确!');history.go(-1);</script>");
return;
}
} 如果我不做sb.checkSalaryIsDole(uid, y, m)检查的话,直接sb.addSalary(sf)是不会出NullPointerException错的,但是业务逻辑就不对了啊。
有谁可以告诉我怎么解决这种在Servlet中调用某个类的2个方法(或多个)时出现NullPointerException错误的啊?
感激不禁拉!
java.lang.NullPointerException
com.inner.model.SalaryBean.addSalary(SalaryBean.java:58)
com.inner.servlet.Salary.doPost(Salary.java:197)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)我的SalaryBean类中有两个方法:
/*
* 发放薪资方法
* @param SalaryFrom
* @return void
*/
public void addSalary(SalaryForm salaryFrom)
{
SalaryForm sf=salaryFrom;
PreparedStatement ps=null;
......
} /*
* 检查同一时期是否已经发放过薪金
* @param uid 用户id
* @param y 年
* @param m 月
* @return int -1为还未发放;1为已经发放过
*/
public int checkSalaryIsDole(int uid,int y,int m)
{
int flag=-1;//初始化为“还未发放”
Statement stmt=null;
.......
return flag;
}Servlet中是这样写的:
String action=(String)request.getParameter("action");
if("add".equals(action))
{
//简单判断
if(request.getParameter("uid")==null ||
"".equals(request.getParameter("uid")) ||
request.getParameter("y")==null ||
"".equals(request.getParameter("y")) ||
request.getParameter("m")==null ||
"".equals(request.getParameter("m")) ||
request.getParameter("money")==null ||
"".equals(request.getParameter("money"))
)
{
out.print("<script>alert('请认真输入相关数据!');history.go(-1);</script>");
return;
}
try
{
//新建SalaryFrom对象
SalaryForm sf=new SalaryForm();
//取得表单值
int uid=Integer.parseInt(request.getParameter("uid"));
double money=Double.parseDouble(request.getParameter("money"));
int y=Integer.parseInt(request.getParameter("y"));
int m=Integer.parseInt(request.getParameter("m"));
String dole_time=(String)request.getParameter("dole_time");
String re=(String)request.getParameter("re");
//开始填充SalaryFrom对象
sf.setUid(uid);
sf.setMoney(money);
sf.setY(y);
sf.setM(m);
sf.setDole_time(dole_time);
sf.setRe(re);
//新建模型层SalaryBean对象
SalaryBean sb=new SalaryBean();
//是否同一时期已发放过薪资标志(1为发放过,-1为未发放)
int flag=sb.checkSalaryIsDole(uid, y, m);
//如果已经发放过该薪资
if(flag>0)
{
out.print("<script>alert('该教工"+y+"年"+m+"月的薪资已经发放过,请勿重复发放!');history.go(-1);</script>");
return;
}
//否则执行发放流程
else
{
sb.addSalary(sf);
out.print("<script>alert('发放成功!');location.href='salary_list.jsp';</script>");
}
}
catch(NumberFormatException e)
{
out.print("<script>alert('金额格式不正确!');history.go(-1);</script>");
return;
}
} 如果我不做sb.checkSalaryIsDole(uid, y, m)检查的话,直接sb.addSalary(sf)是不会出NullPointerException错的,但是业务逻辑就不对了啊。
有谁可以告诉我怎么解决这种在Servlet中调用某个类的2个方法(或多个)时出现NullPointerException错误的啊?
感激不禁拉!
楼主【bugie】截止到2008-07-20 19:40:16的历史汇总数据(不包括此帖):
发帖的总数量:5 发帖的总分数:80 每贴平均分数:16
回帖的总数量:8 得分贴总数量:1 回帖的得分率:12%
结贴的总数量:5 结贴的总分数:80
无满意结贴数:1 无满意结贴分:20
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:20.00 % 无满意结分率:25.00 %
敬礼!
最好把checkSalaryIsDole()和addSalary()两个方法的代码贴出来
* 发放薪资方法
* @param SalaryFrom
* @return void
*/
public void addSalary(SalaryForm salaryFrom)
{
SalaryForm sf=salaryFrom;
PreparedStatement ps=null;
try
{
Function func=new Function();
String sql="insert into inner_salary(uid,money,y,m,dole_time,re) values(?,?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setInt(1, sf.getUid());
ps.setDouble(2, sf.getMoney());
ps.setInt(3, sf.getY());
ps.setInt(4, sf.getM());
ps.setString(5, sf.getDole_time());
ps.setString(6, func.toString(sf.getRe()));//注意转码
ps.executeUpdate();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
ps.close();ps=null;
conn.close();conn=null;
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
/*
* 检查是否已经发放过薪金
* @param uid 用户id
* @param y 年
* @param m 月
* @return int -1为还未发放;1为已经发放过
*/
public int checkSalaryIsDole(int uid,int y,int m)
{
int flag=-1;//初始化为“还未发放”
Statement stmt=null;
ResultSet rs=null;
try
{
stmt=conn.createStatement();
String sql="select uid,y,m from inner_salary where uid="+uid+" and y="+y+" and m="+m;
rs=stmt.executeQuery(sql);
if(rs.next())
{
flag=1;//如果数据存在,则标志置1
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
rs.close();rs=null;
stmt.close();stmt=null;
conn.close();conn=null;
}
catch(SQLException e)
{
e.printStackTrace();
}
}
return flag;
}
肯定会报NullPointer,因为你在checkSalaryIsDole()方法中把它设为null了。
但又有一个问题了,假如一个类里里面好多方法,都是操作数据库的,那每个方法的conn都不close,都不设为null,这样会不会有什么性能问题呢?
* 事务完成要关闭Connection对象
*/
public void closeConnection()
{
try
{
if(this.conn!=null)
{
this.conn.close();
this.conn=null;
}
}
catch(SQLException e)
{
e.printStackTrace();
}
}那么在Servlet里面当事物都处理完了,才调用closeConnection()方法,这样似乎也可以哈