这是main方法 String[] configs = { "classpath:applicationContext.xml", "classpath:applicationContext-quartz.xml" };
BeanFactory factory = new FileSystemXmlApplicationContext(configs);
这是spring的部分配置文件 <bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="10/2 * * * * ?" />
</bean> <bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean> <bean name="jobDetail"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass"
value="com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob" />
</bean> <bean id="scanTaskDao"
class="com.wasu.ini.daq.scan.dao.imple.ScanTaskDaoImple">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <bean id="scanTaskBiz"
class="com.wasu.ini.daq.scan.biz.imple.ScanTaskBizImple">
<property name="std" ref="scanTaskDao"></property>
</bean> <bean id="globalQuartz"
class="com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob">
<property name="scheduler" ref="schedulerFactoryBean" />
<property name="stb" ref="scanTaskBiz"></property>
</bean> 执行这个方法的时候却报空指针异常 public void dapData() {
List<IniDataMid> list = cdb.dapData();
if (list.size() == 0) {
// not do something
} else {
distributeByCondition(list);
}
}异常如下:

java.lang.NullPointerException
at com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob.isChangeFrequency(GlobalTriggerQuartzJob.java:64)
at com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob.executeInternal(GlobalTriggerQuartzJob.java:52)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:79)
at org.quartz.core.JobRunShell.run(JobRunShell.java:199)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)
2010-02-01 22:04:20,609 ERROR [org.quartz.core.ErrorLogger] - Job (DEFAULT.jobDetail threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:210)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)
Caused by: java.lang.NullPointerException
at com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob.isChangeFrequency(GlobalTriggerQuartzJob.java:64)
at com.wasu.ini.daq.quartz.GlobalTriggerQuartzJob.executeInternal(GlobalTriggerQuartzJob.java:52)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:79)
at org.quartz.core.JobRunShell.run(JobRunShell.java:199)
... 1 more

解决方案 »

  1.   

    list == null 
    list.size() 发生空指针
      

  2.   

    list.size()错了,如果list为空的时候,你调用size方法当然会报空指针异常了
      

  3.   

     if (list == null || list.size() == 0) {
                // not do something
            } else {
                distributeByCondition(list);
            }
      

  4.   

    上面的问题改过来了,但是还是报同样的错误。
     我想根本还是cronString = stb.scanConfig(); stb没有注入进去的原因
      

  5.   

    cronString = stb.scanConfig();?
    哪里啊?
    程序贴全点
      

  6.   

    完整的GlobalTriggerQuartzJob类public class GlobalTriggerQuartzJob extends QuartzJobBean { static Logger logger = Logger.getLogger(GlobalTriggerQuartzJob.class); // 默认每2秒检查一次频率
    @SuppressWarnings("unused")
    private String frequency = "10/2 * * * * ?"; boolean flag = false; private ScanTaskBiz stb; private String cronString; private Scheduler scheduler; // 采集数据BIZ
    private CompareDistributeBiz cdb; /* (non-Javadoc)
     * @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.JobExecutionContext)
     */
    protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
    // do the actual work
    System.out.println("[" + new Date() + "]start job ~~~");

    isChangeFrequency();



    } /**
     * @description 检查采集频率是否发生改变
     * @author meiwenhui created on Feb 1, 2010
     */
    public void isChangeFrequency() {

    cronString = stb.scanConfig();  // 得到最新的扫描频率
    flag = cronString.equals(frequency);  // 扫描频率是否改变

    if (flag) { // 没改变
    // not do something ~~~~~~
    } else {
    try {
    // 更新扫描频率
    CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("cronTrigger", Scheduler.DEFAULT_GROUP);
    trigger.setCronExpression(cronString);  // 设置trigger的时间规则
    scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);  // 重置job
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    dataAcquisition();
    } /**
     * @description 到looking中读数据
     * @author meiwenhui created on Feb 1, 2010  
     */
    public void dataAcquisition() {
    cdb.dapData();
    } // ---------setters and getters method------------// public ScanTaskBiz getStb() {
    return stb;
    } public void setStb(ScanTaskBiz stb) {
    this.stb = stb;
    } public Scheduler getScheduler() {
    return scheduler;
    } public void setScheduler(Scheduler scheduler) {
    this.scheduler = scheduler;
    } public CompareDistributeBiz getCdb() {
    return cdb;
    } public void setCdb(CompareDistributeBiz cdb) {
    this.cdb = cdb;
    }}
      

  7.   

    cronString = stb.scanConfig();  // 得到最新的扫描频率
    这个有值吗?
     public void isChangeFrequency() //这个方法加try..catch看看堆栈,到底是哪行的问题
      

  8.   

    stb报空指针错误。
    那你解析spring的配置文件,读取bean为scanTaskBiz看看代理成功没有?
      

  9.   

    没有配置事务管理,以及事务的传播特性,当然会报空了,这样是注入不了的<!-- 配置事务传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" propagation="REQUIRED"/>
    <tx:method name="remove*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
    </tx:attributes>
    </tx:advice><!-- 哪些类的哪些方法参与事务 -->
    <aop:config>
    <aop:pointcut id="allManagerMethod" expression="execution(* com.gsd.test.service.*.*(..))"/>
    <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
    </aop:config>
    FORM:QQ群Java 2  Enterprise Edition(88509302)
      

  10.   

    我配置了,是不是这样的 <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml">
    </property>
    </bean> <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice> <aop:config>
    <aop:advisor advice-ref="txAdvice"
    pointcut="execution(* com.wasu.ini.daq.*.biz.*Biz.*(..))" />
    </aop:config>