Porownywanie elementow z uzyciem klasy abstrakcyjnej

0

Czesc, mam problem przedstawie najpierw fragment kodu:

 
abstract class Figura {
   ...
   abstract double dajMaksymalnyPunktX();
   ...
}

Mam klase Trojkat i Czworokat ktora dziedziczy po Figurze i implementuje metode jak wyzej. I teraz jak chce posortowac tablice porownujac elementy:

class porownajMaxWartosciX implements Comparator<Figura>{

    public int compare(Figura objekt1, Figura objekt2){

       double x1 = objekt1.dajMaksymalnyPunktX();
       double x2 = objekt2.dajMaksymalnyPunktX();

       if(x1 < x2)
            return 1;
        else if(x1 > x2)
            return -1;
        else
            return 0;
    }
}

To wysypuje sie program. Dodam ze w ten sposob wszystko dziala ok:

   if(objekt1 instanceof Trojkat)
        {
        x1 = ((Trojkat)objekt1).dajMaksymalnyPunktX();
        }

Metode wywoluje w ten sposob :

Figura [] tablica = tablicaTrojkatow;

Arrays.sort(tablica, new porownajMaxWartosciX());

return tab[0].dajMaksymalnyPunktX();

Ktos moze ma jakis pomysl o co chodzi ?!

0

Wysypuje się czyli co robi?

0

Mianowicie podczas uruchamiania:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at com.mientus.frame.porownajMaxWartosciX.compare(ComparatorClass.java:113)
        at com.mientus.frame.porownajMaxWartosciX.compare(ComparatorClass.java:88)
        at java.util.Arrays.mergeSort(Arrays.java:1270)
        at java.util.Arrays.mergeSort(Arrays.java:1281)
        at java.util.Arrays.sort(Arrays.java:1210)
        at com.mientus.frame.MinMax.dajMaksimumX(MinMax.java:73)
        at com.mientus.frame.NewJPanel.paint(NewJPanel.java:68)
        at javax.swing.JComponent.paintChildren(JComponent.java:862)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JComponent.paintChildren(JComponent.java:862)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
        at javax.swing.JComponent.paintChildren(JComponent.java:862)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:34)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1793)
        at java.awt.Window.paint(Window.java:3375)
        at sun.awt.RepaintArea.paintComponent(RepaintArea.java:276)
        at sun.awt.RepaintArea.paint(RepaintArea.java:241)
        at apple.awt.ComponentModel.handleEvent(ComponentModel.java:263)
        at apple.awt.CWindow.handleEvent(CWindow.java:525)
        at java.awt.Component.dispatchEventImpl(Component.java:4812)
        at java.awt.Container.dispatchEventImpl(Container.java:2143)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4566)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:680)
        at java.awt.EventQueue.access$000(EventQueue.java:86)
        at java.awt.EventQueue$1.run(EventQueue.java:639)
        at java.awt.EventQueue$1.run(EventQueue.java:637)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
        at java.awt.EventQueue$2.run(EventQueue.java:653)
        at java.awt.EventQueue$2.run(EventQueue.java:651)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:650)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
0

Któryś z obiektów objekt1 / objekt2 musi być nullem (instanceof zwraca false dla nulla, więc reszta - czyli wywalające NPE dajMaksymalnyPunktX() - się nie wykonuje).

0

Zdradź jeszcze jak tworzysz zmienną tablicaTrojkatow

Figura [] tablica = tablicaTrojkatow; 
Arrays.sort(tablica, new porownajMaxWartosciX());

i po Ci nowa zmienna tablica? Wystarczy

Arrays.sort(tablicaTrojkatow, new porownajMaxWartosciX());
0

Nie nie spoko juz dziala, do przykladu tylko tak napisalem ;) po prostu tworzylem tablice Figura [] tablica = new Tablica [10] a wpisywalem do tablicy tylko 3 figury wiec jadac po calej tablicy wykrzaczal sie :D Mala nieuwaga a nie moglem do tego dojsc, dzieki wielkie ;)

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