RMI przyklad z ksiązki Java 2 Techniki zaawansowane rzuca wyjątkiem

0

Witam, analizuję przykład Warehouse dotyczący przekazywania parametrów zdalnym metodom i napotkałem następujący problem.
Po uruchomieniu WarehouseServer.java, rejestruję rmiregistry & i serwer się odpala tu problemu nie ma ( I hope :) )
Problem mam z klientem WarehouseClient.java tz. odpalam klienta zaznaczam odpowiednie pola wyboru naciskam Akceptuj i rzuca mi wyjątek.
Odnoszę wrażenie iż nie następuje komunikacja poprzez interface Warehouse.. :(
Jeśli ktoś miał podobny problem lub podpowie mi jak to ugryźć to będę wdzięczny...
Z góry dziękuję za okazaną pomoc.

wycinek programu:

 private void callWarehouse()
   { 
       
       
      try
         
        
      {  
          
         ArrayList<String> selected = new ArrayList<String>();
         for (JCheckBox checkBox : hobbies)
            if (checkBox.isSelected()) selected.add(checkBox.getText());
         Customer c = new Customer(Integer.parseInt(age.getText()),
            (male.isSelected() ? Product.MALE : 0)
            + (female.isSelected() ? Product.FEMALE : 0),
            selected.toArray(new String[selected.size()]));
         System.out.println(c);
        
        ArrayList<Product> recommendations= warehouse.find(c);
         result.setText(c + "\n");
        for (Product p : recommendations)
         {  
            String t = p.getDescription() + "\n";
            result.append(t);
         }
         
      }
      catch (Exception e)
      {  
         e.printStackTrace();
         result.setText("Exception: " + e);
      }
   }
java.lang.NullPointerException
	at warehouse.WarehouseClientFrame.callWarehouse(WarehouseClient.java:131)
	at warehouse.WarehouseClientFrame.access$000(WarehouseClient.java:56)
	at warehouse.WarehouseClientFrame$1.actionPerformed(WarehouseClient.java:100)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6535)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6300)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4891)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
	at java.awt.Container.dispatchEventImpl(Container.java:2280)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
0

W wierszu 131

ArrayList<Product> recommendations= warehouse.find(c);

warehouse jest nullem, nigdzie nie inicjalizujesz tej zmiennej.

0

:) to że jest nullem to wiem. Według autora książki tak ma być. Zastanawiam się czy czegoś nie pominął, w załączniku udostępniłem wszystkie klasy tego przykładu.

warehouse.find(c)

odwołuje się do interfejsu który powinien komunikować się ze zdalną implementacją interfejsu zlokalizowaną w pliku WarehouseImpl... skąd powinien pozyskać dane ...

0

Udostępniłeś swoje wersje klas, a nie klasy autora.
Poza tym opowiadasz bzdury, jeśli zmienna jest null, to żadnej metody dla niej nie wywołasz i żadnych danych nie pozyskasz.

0

Przykład jest z książki Core Java 2 Techniki zaawansowane wydanie II str. 331 - 340, jedynie co zrobiłem to opisałem ścieżki do pliku client.policy oraz WarehouseClient.properties oraz opisałem w jakim mają być pakiecie wszystkie klasy. Jeśli masz jakieś konkretnie propozycje to chętnie skorzystam z twojego doświadczenia, natomiast prosiłbym abyś nie określał czy bzdury opowiadam czy też nie ponieważ bazuję na w/w książce i staram się rozwiązać problem tematu który dopiero poznaję.

0

Zwrot bzdury dotyczy Twojej sugestii, że można wywołać metodę na rzecz nulla i uzyskać jakiś rezultat. Nie ma to nic wspólnego z rozwiązywaniem problemu, który dopiero poznajesz.
Nie dość, że piszesz bzdury, to jeszcze łżesz.
W kodzie klasy WarehouseClient jest

         JFrame frame = new WarehouseClientFrame(centralWarehouse);

A kod klasy WarehouseClientFrame zaczyna się tak:

class WarehouseClientFrame extends JFrame
{  
   public WarehouseClientFrame(Warehouse warehouse)
   {  
      this.warehouse = warehouse; //a Ty ten wiersz usunąłeś
0

Rzeczywiście była, masz rację co do kwestii linijki. Ale jak byś odpalił ten przykład za nim zacząłeś oceniać w tak małostkowy sposób to byś miał świadomość iż ta linijka nie rozwiązuje powyższego problemu. Dalej występuj problem.
Słusznie zauważyłeś iż linijka była opisana komentarzem ( nie zauważyłem tego - przykład zassałem z ftp heliona) ale forma komunikacji żenująca. Tak więc proszę abyś nie kontynuował wypowiedzi co do tego problemu ponieważ zamiast spróbować pomóc, swoimi sugestiami próbujesz doprowadzić do konfliktu. A nie chce mi się bawić w rozgrywki słowne lecz szukam informacji. Za sugestie dotyczącą w/w linijki oraz propozycje próby rozwiązania problemu dziękuję....

0

Znowu mijasz się z prawdą, po wprowadzeniu podanych przeze mnie w poprzednim poście trzech poprawek (w pliku Warehouse.Client.java), program działa.
warehouse.png

0

Może nie do końca się zrozumieliśmy, sama powłoka się odpala i tu jest OK ale problem zaczyna się jak znaczysz ptaszkiem np. Komputery i klikniesz Akceptuj. u mnie wyrzuca wtedy wyjątek null

<image>foo</image>

1

Na pewno?
Warehouse2.png
W kodzie, który udostępniłeś, wiersz 122 wygląda tak:

ArrayList<String> selected = new ArrayList<String>();

Nie ma szans by ten wiersz wyrzucił NPE. Krótko mówiąc, znowu zmodyfikowałeś kod z książki i znowu zrobiłeś to źle.

0

no to w takim razie walczę z tematem dalej muszę dojść do tego gdzie popełniam błąd, dzięki za info iż program działa.... muszę to raz jeszcze prześledzić... :)

0

Działa, po prostu ślepo zaufałem przykładowi zaciągniętemu z heliona ftp - po niewielkiej modyfikacji wszystko zagrało tak jak trzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1