Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Quartz重新调度程序函数的NullPointerException_Java_Nullpointerexception_Quartz Scheduler - Fatal编程技术网

Java 使用Quartz重新调度程序函数的NullPointerException

Java 使用Quartz重新调度程序函数的NullPointerException,java,nullpointerexception,quartz-scheduler,Java,Nullpointerexception,Quartz Scheduler,我不熟悉Quartz API,目前正在使用Quartz 2.2.x版在java中创建调度器类对象以支持我的学校项目,但在调度器中遇到空指针异常;在重新安排ECRON功能时。我试图设置一个函数来接受cron表达式来重新安排quartz作业,但不知道我做错了什么。请帮我纠正这个错误 public class quartzScheduler { public JobDetail job; public Trigger trigger; public Scheduler scheduler; pub

我不熟悉Quartz API,目前正在使用Quartz 2.2.x版在java中创建调度器类对象以支持我的学校项目,但在调度器中遇到空指针异常;在重新安排ECRON功能时。我试图设置一个函数来接受cron表达式来重新安排quartz作业,但不知道我做错了什么。请帮我纠正这个错误

public class quartzScheduler {

public JobDetail job;
public Trigger trigger;
public Scheduler scheduler;

public void quartzScheduler() throws SchedulerException,InterruptedException
{
    job = JobBuilder.newJob(quartzJob.class)
            .withIdentity("quartzJob", "group1").build();

    trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
                            .startAt(futureDate(1, IntervalUnit.HOUR))
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInHours(1).repeatForever())
            .build();

    scheduler.start();
    scheduler.scheduleJob(job, trigger);
}

    public void rescheduleCron(String cronExpression) throws SchedulerException
    {
        Trigger cronTrigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
            .withSchedule(cronSchedule(cronExpression))
            .build();

        scheduler.rescheduleJob(trigger.getKey(), cronTrigger);    
    }


public static void main(String[] args) 
{
    quartzScheduler sch= new quartzScheduler(); 
    try {
        sch.rescheduleCron("0 0 * * * ?");
    } catch (SchedulerException ex) {
        Logger.getLogger(quartzScheduler.class.getName()).log(Level.SEVERE, null, ex);
    }
}
rescheduleCron()
中,您的
触发器尚未初始化。它被设置为null,当您尝试调用它时,您会得到一个NullPointerException

我知道你在做什么。。。我认为您试图使用quartzScheduler()作为构造函数,这就是为什么您希望初始化
触发器的原因。非常小的改动可以解决这个问题:从该函数中删除返回值。Java构造函数没有返回值

应该是这样的:

public class QuartzScheduler {

    public JobDetail job;
    public Trigger trigger;
    public Scheduler scheduler;

    public QuartzScheduler() throws SchedulerException, InterruptedException {
        job = JobBuilder.newJob(quartzJob.class)
                .withIdentity("quartzJob", "group1").build();

        trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("quartzTrigger", "group1")
                .startAt(futureDate(1, IntervalUnit.HOUR))
                .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInHours(1).repeatForever())
                .build();
        scheduler = new Scheduler(); //maybe do something else here.

        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }

    public void rescheduleCron(String cronExpression) throws SchedulerException {
        Trigger cronTrigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
            .withSchedule(cronSchedule(cronExpression))
            .build();

        scheduler.rescheduleJob(trigger.getKey(), cronTrigger);    
    }
}

public static void main(String[] args) {
    QuartzScheduler sch= new QuartzScheduler(); 
    try {
        sch.rescheduleCron("0 0 * * * ?");
    } catch (SchedulerException ex) {
        Logger.getLogger(quartzScheduler.class.getName()).log(Level.SEVERE, null, ex);
    }
}
我改变了什么:

  • 将您的类名大写(按惯例)
  • 从构造函数中删除了返回值和异常
  • 已将main()调用移到类外部。main()调用使用该类,它不是该类的一部分

谢谢!在尝试了你的建议之后,我意识到我也错过了初始化调度程序。scheduler=new StdSchedulerFactory().getScheduler();需要在启动调度程序之前添加。很好!很高兴这有帮助。我更新了答案以反映这一点。