繁体   English   中英

AsyncEventHandler-实时系统Java

[英]AsyncEventHandler - Real Time System Java

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

  • 罐子传递到传送带上
  • 罐装满了
  • 罐头被检查
  • 如果罐子损坏,则将其从传送带上卸下

错误:

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)

我想使用AsyncEventHandler来触发如果罐头损坏的代码,但是如果在第一次尝试中发现罐头损坏则给出NullPointerException错误,但是如果罐头在第一次循环中没有损坏,则代码可以正常工作。

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类没有默认的构造函数。 因此,在Conveyor课程中,您Can can; 这可能会给您NullPointerException 只需向Can类中添加另一个构造函数,如下所示:

public Can() {};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM