2012-03-03 2 views
0

У меня есть код ниже:Instance присвоение переменной не прилипает

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; } 

возвращает нуль для него который я не понимаю почему. Кто-нибудь имеет представление о том, что происходит?

+0

Вы действительно пропустили это 'if' +' while' + 'if'? –

+0

Я поставил перерыв после того, как задание осталось тем же. – Cemre

ответ

2

Предполагая, что вы ударяете ваш оператор присваивания, вот некоторые вещи, чтобы рассмотреть следующие вопросы:

  • ли getProvider() называться Вызывается перед handleInform?

  • Есть handleInform и getProvider(), вызываемые отдельными потоками, создавая проблему с расы или видимости памяти?

  • Является ли переменная provider переписываемой через некоторое время между назначением в handleInform и извлечением с помощью getProvider()?

Я ничего не могу придумать. Ваша переменная область видимости выглядит нормально. Вы должны добавить оператор журнала к методу getProvider(), чтобы увидеть, когда он вызывается в отношении handleInform, и записывать любые другие места в программе, которые могут перезаписать значение переменной.

+0

Действительно, функции не вызывались линейно (анонимный класс назывался последним), что вызывало инициализация других классов (заявления ниже анонимного класса), которые использовали полученное переменное значение null. Большое спасибо. – Cemre

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

? Is что позвонить в provider.getName() работает как ожидалось?

Вы действительно звоните getProvider() позже в том же экземпляре?

В основном есть много, которые могли бы пойти не так здесь, и вы не дали нам никакой информации о том, что вы видите, за вызов метода возвращающего нуль ...

+0

Да, насколько я проверял, все это правильно. Все работает нормально, это просто по какой-то причине, что метод доступа не работает, как я ожидал – Cemre

+0

Я заметил, что он хорошо повсюду внутри анонимного класса. Как только я попытаюсь распечатать его за его пределами, он печатает нуль. Может быть, есть проблема? Кроме того, когда я пытаюсь использовать подобный this.provider внутри анонимного класса, он продолжает сообщать мне, что это не поле. – Cemre

Смежные вопросы