【问题标题】:AsyncEventHandler - Real Time System JavaAsyncEventHandler - 实时系统 Java
【发布时间】:2019-06-02 17:06:28
【问题描述】:

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

  • 罐子被传送到传送带上
  • 罐子装满了
  • 罐子被检查了
  • 如果罐子损坏,它将从传送带上移除

错误:

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");

        }

    }

}

【问题讨论】:

  • 给我们一个提示怎么样,比如告诉我们你的代码的哪一行抛出了NullPointerException?也许您也可以发布同一 NullPointerException 的堆栈跟踪?
  • @Abra 感谢您的评论,我已经编辑了我的代码并添加了我收到的错误
  • 你能告诉我们文件assignment.java的第99行吗?
  • @Abra 它在 Sensor 类下的“damage.fire()”
  • 您调用Sensor.start() 之前在类realtime 的构造函数中为damage 赋值。但是如果罐子损坏,您只能在类Sensor 的方法run() 中访问damage。因此,如果您的第一个罐子损坏,您在为其分配值之前访问damage。因此它是空的,因此你得到NullPointerException

标签: java multithreading asynchronous real-time


【解决方案1】:

您的Can 类没有默认构造函数。所以在你的Conveyor 类中你有Can can; 这可能会给你NullPointerException。只需向您的 Can 类添加另一个构造函数,如下所示:

public Can() {};

【讨论】:

  • 我的 Can 类中有一个构造函数,它是指定 id 的地方
  • 但是为了构造该对象,它必须有一个 int 作为参数传递。在您的其他类中,您尝试在不传递 int 参数的情况下构造 Can 对象。您没有构造函数来执行此操作。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多