发现在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错误的啊?
    感激不禁拉!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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 %                  
    敬礼!
      

  2.   

    把SalaryBean.java:58这行代码标出来,这里抛异常了
    最好把checkSalaryIsDole()和addSalary()两个方法的代码贴出来
      

  3.   

    代码椒是这样的: /*
     * 发放薪资方法
     * @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;
    }

      

  4.   

    因为你两个方法都要用conn,而每个方法用完后都会关闭他,所以第二个方法在ps=conn.prepareStatement(sql);
    肯定会报NullPointer,因为你在checkSalaryIsDole()方法中把它设为null了。
      

  5.   

    恩,试了一下,4楼的兄弟是正确的,谢谢!
    但又有一个问题了,假如一个类里里面好多方法,都是操作数据库的,那每个方法的conn都不close,都不设为null,这样会不会有什么性能问题呢?
      

  6.   

    我在模型层SalaryBean.java里面再加多一个方法 /*
     * 事务完成要关闭Connection对象
     */
    public void closeConnection()
    {
    try
    {
    if(this.conn!=null)
    {
    this.conn.close();
    this.conn=null;
    }
    }
    catch(SQLException e)
    {
    e.printStackTrace();
    }
    }那么在Servlet里面当事物都处理完了,才调用closeConnection()方法,这样似乎也可以哈