实例变量赋值不会粘

时间:2012-03-03 00:01:13

标签: java class

我有以下代码:

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,我不知道为什么。任何人都知道最近会发生什么?

2 个答案:

答案 0 :(得分:2)

只有在所有发生变量时才初始化变量:

  • setup()被称为
  • 匿名类中的handleInform方法称为
  • 在命中行之前不会抛出异常
  • results.length > 0
  • dfd.getAllServices()至少有一项服务
  • 至少有一个服务描述的类型为“allocate-appointmentments”

你确定所有这些都是这样的吗?您是否正在使用以下日志记录:

  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

  • handleInformgetProvider()是否在单独的线程上调用,造成种族或内存可见性问题?

  • provider变量在handleInform中的分配与getProvider()的检索之间被覆盖了吗?

我想不出别的什么。您的变量范围看起来没问题。您应该在getProvider()方法中添加一个日志语句,以查看它在何时被调用handleInform,并记录程序中可能覆盖变量值的任何其他位置。