我有以下代码:
public class PatientAgent extends Agent {
private final String HYPHEN = "-";
private ArrayList<HashSet<Integer>> prefs;
private AID provider ;
private boolean hasAppointment;
private int appointmentNo;
@Override
protected void setup() {
hasAppointment = false;
appointmentNo = 0; // A value of zero means agent does not have any
// allocated appointments (yet)
initPrefs(getArguments());
System.out.println(prefs.toString());
// Build the description used as template for the subscription
DFAgentDescription template = new DFAgentDescription();
ServiceDescription templateSd = new ServiceDescription();
templateSd.setType("allocate-appointments");
template.addServices(templateSd);
SearchConstraints sc = new SearchConstraints();
// We want to receive 10 results at most
sc.setMaxResults(new Long(10));
addBehaviour(new SubscriptionInitiator(this, DFService.createSubscriptionMessage(this, getDefaultDF(), template, sc)) {
protected void handleInform(ACLMessage inform) {
System.out.println("Agent "+getLocalName()+": Notification received from DF");
try {
DFAgentDescription[] results = DFService.decodeNotification(inform.getContent());
if (results.length > 0) {
// Assume there is only one hospital agent
assert(results.length == 1);
DFAgentDescription dfd = results[0];
Iterator it = dfd.getAllServices();
while (it.hasNext()) {
ServiceDescription sd = (ServiceDescription) it.next();
if (sd.getType().equals("allocate-appointments")) {
provider = dfd.getName();
System.out.println("Allocate-appointments service found:");
System.out.println("- Service \""+sd.getName()+"\" provided by agent "+provider.getName());
}
}
}
}
catch (FIPAException fe) {
fe.printStackTrace();
}
}
} );
public AID getProvider() { return provider; }
我清楚地使用行
初始化提供者 provider = dfd.getName();
但行
public AID getProvider() { return provider; }
为它返回null,我不知道为什么。任何人都知道最近会发生什么?
答案 0 :(得分:2)
只有在所有发生变量时才初始化变量:
setup()
被称为handleInform
方法称为results.length > 0
dfd.getAllServices()
至少有一项服务你确定所有这些都是这样的吗?您是否正在使用以下日志记录:
System.out.println("Allocate-appointments service found:");
System.out.println("- Service \""+sd.getName()+
"\" provided by agent "+provider.getName());
? 那个是否按预期调用了provider.getName()
?
您确定稍后在同一个实例上调用getProvider()
吗?
基本上有一个很多可能会出错,除了方法调用返回null之外,你还没有给我们任何关于你所看到的信息......
答案 1 :(得分:2)
假设您正在执行任务声明,请考虑以下事项:
在getProvider()
之前调用handleInform
?
handleInform
和getProvider()
是否在单独的线程上调用,造成种族或内存可见性问题?
provider
变量在handleInform
中的分配与getProvider()
的检索之间被覆盖了吗?
我想不出别的什么。您的变量范围看起来没问题。您应该在getProvider()
方法中添加一个日志语句,以查看它在何时被调用handleInform
,并记录程序中可能覆盖变量值的任何其他位置。