AsyncEventHandler-实时系统Java

AsyncEventHandler-实时系统Java,java,multithreading,asynchronous,real-time,Java,Multithreading,Asynchronous,Real Time,我正在尝试制作一个模拟程序,其中: 罐头被传送到传送带上 罐子装满了 这个罐子被检查过了 如果罐损坏,将从输送机上拆下 错误: Exception in thread "RealtimeThread[pri=20,aperiodic]" java.lang.NullPointerException at assignment$Sensor.run(assignment.java:99) at javax.realtime.RealtimeThread$Logic.run(RealtimeT

我正在尝试制作一个模拟程序,其中:

  • 罐头被传送到传送带上
  • 罐子装满了
  • 这个罐子被检查过了
  • 如果罐损坏,将从输送机上拆下
错误:

Exception in thread "RealtimeThread[pri=20,aperiodic]" 
java.lang.NullPointerException
at assignment$Sensor.run(assignment.java:99)
at javax.realtime.RealtimeThread$Logic.run(RealtimeThread.java:244)
at javax.realtime.MemoryArea.enter(MemoryArea.java)
at javax.realtime.MemoryArea.enterInternal(MemoryArea.java:1472)
at javax.realtime.RealtimeThread$Logic.run(RealtimeThread.java:230)
如果can损坏,我想使用
AsyncEventHandler
触发一个代码,但如果在第一次尝试时发现can损坏,则会出现NullPointerException错误。但是,如果can在第一次循环中未损坏,则代码工作正常

import java.util.Random;
import javax.realtime.*;

public class realtime{

    AsyncEvent damage;

    public static void main(String[] args) {

        realtime a = new realtime();
    }

    public realtime() {

        Can can = new Can(1);

        Conveyer conveyer = new Conveyer(can);
        Sensor Sensor = new Sensor(can);
        Grabber grabber = new Grabber(can, Sensor);

        ReleaseParameters relConveyer = new PeriodicParameters(new RelativeTime(1000,0));
        ReleaseParameters relSensor = new PeriodicParameters(new RelativeTime(1000,0));

        conveyer.setReleaseParameters(relConveyer);
        Sensor.setReleaseParameters(relSensor);

        conveyer.start();
        Sensor.start();

        damage = new AsyncEvent();
        damage.setHandler(grabber);

    }

    class Can {

        int id;
        boolean filled;
        boolean damaged;

        public Can(int id) {
            this.id = id;
        }

        public void isFilled(boolean status) {
            this.filled = status;                   //Print if the Can is filled
        }

        public void isDamaged(boolean status) {
            this.damaged = status;          
        }

    }

    class Conveyer extends RealtimeThread {

        Can can;

        Random random = new Random();

        public Conveyer(Can can) {
            this.can = can;
        }

        @Override
        public void run() {                         //While loop can be used to repeat

            while(true) {
                System.out.println("Can " + can.id + " has entered the conveyer");
                System.out.println("Can " + can.id + " is being filled");
                can.isFilled(true);                     //Sleep to give time to fill
                System.out.println("Can " + can.id + " is filled");
                System.out.println("Can " + can.id + " is being scanned");
                can.isDamaged(random.nextBoolean());
                try {
                    waitForNextRelease();
                }
                catch (Exception e) {}
            }

        }

    }

    class Sensor extends RealtimeThread{

        Can can;

        public Sensor(Can can) {
            this.can = can;
        }

        @Override
        public void run() {                         //While loop can be used to repeat

            while(true) {
                if(can.damaged) {
                    System.out.println("Can " + can.id + " is Damaged!");
                    damage.fire();
                } else {
                    System.out.println("Can " + can.id + " is moved to Stage 2");
                }
                try {
                    waitForNextRelease();
                }
                catch (Exception e) {}
            }

        }

    }

    class Grabber extends AsyncEventHandler {

        Can can;
        RealtimeThread rtt;
        boolean damaged = false;

        public Grabber(Can can, RealtimeThread rtt) {
            this.can = can;
            this.rtt = rtt;
        }

        public void handleAsyncEvent() {

            System.out.println("Can " + can.id + " is disposed");

        }

    }

}

您的
Can
类没有默认构造函数。所以在你的
传送带
课程中,你有
罐头
这可能会给您带来
NullPointerException
。只需向Can类添加另一个构造函数,如下所示:

public Can() {};

您的
Can
类没有默认构造函数。所以在你的
传送带
课程中,你有
罐头
这可能会给您带来
NullPointerException
。只需向Can类添加另一个构造函数,如下所示:

public Can() {};

给我们一个提示,比如告诉我们哪行代码抛出了
NullPointerException
?也许你也可以发布同一个
NullPointerException
?@Abra谢谢你的评论,我已经编辑了我的代码并添加了我收到的错误。你能告诉我们文件
assignment.java
?@Abra它的“damage.fire()”的第99行在你调用的传感器类
Sensor.start()下吗
在为类
realtime
的构造函数中的
损坏指定值之前。但是,如果can损坏,您只能在传感器类的方法
run()
中访问
damage
。因此,如果您的第一个罐损坏,则在为其赋值之前,您正在访问
damage
。因此它是空的,因此您会得到
NullPointerException
。给我们一个提示,比如告诉我们代码的哪一行抛出了
NullPointerException
?也许你也可以发布同一个
NullPointerException
?@Abra谢谢你的评论,我已经编辑了我的代码并添加了我收到的错误。你能告诉我们文件
assignment.java
?@Abra它的“damage.fire()”的第99行在你调用的传感器类
Sensor.start()下吗
在为类
realtime
的构造函数中的
损坏指定值之前。但是,如果can损坏,您只能在传感器类的方法
run()
中访问
damage
。因此,如果您的第一个罐损坏,则在为其赋值之前,您正在访问
damage
。因此它是空的,因此您会得到
NullPointerException
。我的Can类中确实有一个构造函数,它是指定id的地方,但为了构造该对象,它必须将int作为参数传递。在其他类中,您尝试在不传递int参数的情况下构造Can对象。在我的Can类中有一个构造函数,它是id被指定的地方,但是为了构造这个对象,它必须有一个作为参数传递的int。在其他类中,您尝试在不传递int参数的情况下构造Can对象。你没有一个构造函数来做这件事。