【发布时间】: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