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对象。你没有一个构造函数来做这件事。