代码如下
import hotlong.hotcrm.action.CRMClockAction;
import hotlong.hotcrm.model.SystemUsers;
import java.util.Date;
import java.util.TimerTask;
import org.apache.struts2.ServletActionContext;public class ColokTask extends TimerTask { 
CRMClockAction ca=new CRMClockAction();
private int i=0;  
  
    public void run(){  
             SystemUsers su=(SystemUsers)ServletActionContext.getRequest().getSession().getAttribute("LoginUser");
          try {
     if(su!=null){
ca.clock();
         }
     } catch (Exception e) {
e.printStackTrace();
System.out.println("定时器运行失败");
}
    } 
}
action代码如下
public class CRMClockAction extends BaseAction{
public void clock()throws Exception{
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
}
}
我的意图就是想在run方法中判断session中的loginuser 变量是否为空  然后调用action 中 clock方法  
但是无法实现  
java.lang.NullPointerException
at hotlong.hotcrm.common.util.ColokTask.run(ColokTask.java:15)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
错误原因是在获取session变量时出错
不知道怎么回事     跪求答案 活着好的解决方法

解决方案 »

  1.   

    之前获取session一直是这样的方式吗?
      

  2.   

    用这种方法启动定时器
    public class MyTaskTimer implements ServletContextListener {
    private Timer timer = null; @Override
    public void contextDestroyed(ServletContextEvent event) {
    // TODO Auto-generated method stub
    timer.cancel(); } @Override
    public void contextInitialized(ServletContextEvent event) {
            long a=2000;
        
    timer = new Timer(true); timer.schedule(new DataService(event.getServletContext()),a);



    }}之后在你的定时器里:
    private static ServletContext context = null;
    public DataService(ServletContext context1) {
    this.context = context1; }这样你就可以用context.getAttribute(arg0)相关的方法了。
      

  3.   

    你应该再写一个类,用于拿去容器的session的,然后你调用那个类来操作session