Dlaczego i która lista/tablica jest pusta?

0

Witam, potrzebuję pomocy w zlokalizowaniu problemu w kodzie:

private void dodajDoListyZaznaczonychCheckBoxow(JCheckBox...listaChB){
       ArrayList<Integer> ListaIndexowZaznaczonychChB=new ArrayList<>();
       for(int i=0;i<listaChB.length;i++){
           System.out.println(i+" i");
           if(listaChB[i].isSelected()==true)
               ListaIndexowZaznaczonychChB.add(i);
       }
       int[] tab = new int[ListaIndexowZaznaczonychChB.size()]; //potrzebuje tablicy prymitywnych int dla metody Orders.addOrder() ze wzgledu na specyfike "OrderID(int... tabIndex){...}"
       for(int j=0;j<ListaIndexowZaznaczonychChB.size();j++){
           System.out.println(j+" j");
          tab[j]=ListaIndexowZaznaczonychChB.get(j).intValue();
       }
       Orders.addOrder(tab);
       System.out.println("dodane");
   }
   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       dodajDoListyZaznaczonychCheckBoxow(jCheckBox1,jCheckBox2,jCheckBox3,jCheckBox4,jCheckBox5,jCheckBox6,jCheckBox7,jCheckBox8,jCheckBox9,jCheckBox10,jCheckBox11);
       System.out.println(Orders.activeOrders);
   }                                        

Kod rzuca wyjątkiem "java.lang.IndexOutOfBoundsException". Wiem że oznacza on wykroczenie poza jakąś tablice lub to, że jest ona pusta, jednak juz od dluższego czasu szukam miejsca, w którym się to dzieje i nic nie mogę znaleźć. Aktualnie te 2 println sa dodane jako pomoc przy znalezieniu, jednak i tak na żadne rozwiazanie mnie nie naprowadziły.

Po zaznaczeniu np. 3 checkboxów i wcisnieciu buttona otrzymuje taki kod zwrotny:


run:
0 i
1 i
2 i
3 i
4 i
5 i
6 i
7 i
8 i
9 i
10 i
0 j
1 j
2 j
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
	at restaurant.Orders.addOrder(Orders.java:25)
	at gui.jOrdersFrame.dodajDoListyZaznaczonychCheckBoxow(jOrdersFrame.java:220)
	at gui.jOrdersFrame.jButton1ActionPerformed(jOrdersFrame.java:224)
	at gui.jOrdersFrame.access$100(jOrdersFrame.java:17)
	at gui.jOrdersFrame$2.actionPerformed(jOrdersFrame.java:93)
	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:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	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:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	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)

Może ktoś zauważy, w którym miejscu kodu leży problem.

1

No, tak jak w komentarzu. Problem jest w Orders.addOrder(tab)
Jak chcesz coś więcej to pokaż jego kod.

0
szweszwe napisał(a):

No, tak jak w komentarzu. Problem jest w Orders.addOrder(tab)
Jak chcesz coś więcej to pokaż jego kod.


 public static void addOrder(int...index){
        for(int i=0;i<index.length;i++){
        Orders.activeOrders.add(new Order(Products.products.get(index[i])));
        }
        Order.tmpId++;
    }

0

No wyglada na to, że Products.products ma rozmiar 0. Próbowałeś użyć debugera?

0

Nie ma możliwości żeby ta lista była pusta, mam tan dodane 11 obiektów przez maina i wszystkie program widzi i wyswietla. Probować, próbowałem jednak nie znam się na tym jeszcze za bardzo także nic z tego nie wynikło.

0
public static void addOrder(int...index){
        for(int i=0;i<index.length;i++){
        Orders.activeOrders.add(new Order(Products.products.get(index[i])));
        }
        Order.tmpId++;
    }

Sprawdź i pokaż nam jaki jest rozmiar tablicy index i jakie ma wartości oraz co znajduje się w Products.products

edit: nie znam całej logiki tego kodu, ale jeśli index[i] zwróci np 12, a w products masz 11 obiektów, no to masz problem.

0

Jeżeli chodzi o produkty to są dodane co widać na screenie, jest tam 11 obiektów. natomiast tablica index nie ma określonej stałej wielkości ponieważ jest przesyłana do funkcji. W niej mają się znajdować indeksy wybranych produktów.
Dlatego też w tej części kodu:

for(int j=0;j<ListaIndexowZaznaczonychChB.size();j++){
            System.out.println(j+" j");
           tab[j]=ListaIndexowZaznaczonychChB.get(j).intValue();
        }
        Orders.addOrder(tab);

wysyłam tam taką właśnie tablice i ponieważ jest tylko 11 buttonów chyba nie ma możliwości przekroczenia listy Products nawet przy zaznaczeniu ich wszystkich

title

2

W stack trace masz:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at restaurant.Orders.addOrder(Orders.java:25)

Bład leci, bo próbujesz wyciagnać coś z ArrayList z indeksu gdzie nic nie ma - jedyne miejsce gdzie jest wywoływane ArrayList.get według kodu Twojej metody addOrder to Products.products.get dlatego wnioskuję, że ta kolekcja jest pusta. Wypisz co się w niej znajduje z poziomu metody addOrder, może Twój program w międzyczasie napisuje jej zawartość.

0

Dodając zamówienie w main

Orders.addOrder(0,3,6,10);

I po zmianie metody addOrder

    public static void addOrder(int...index){
        for(int i=0;i<index.length;i++){
        Orders.activeOrders.add(new Order(Products.products.get(index[i])));
        }
        Order.tmpId++;
        System.out.println(Orders.activeOrders+" Test 1");
        System.out.println(Products.getProducts()+" Test 2");
    }

Program wypisuje poprawnie

run:
[ID zamówienia: 1
Status: aktywne
Zamówienie: Nazwa: Ryba z frytkami, Cena: 19.5 PLN

, ID zamówienia: 1
Status: aktywne
Zamówienie: Nazwa: Skrzydełka z kurczaka, Cena: 12.5 PLN

, ID zamówienia: 1
Status: aktywne
Zamówienie: Nazwa: Coca-Cola, Cena: 4.2 PLN

, ID zamówienia: 1
Status: aktywne
Zamówienie: Nazwa: Wino, Cena: 15.0 PLN

] Test 1
[Nazwa: Ryba z frytkami, Cena: 19.5 PLN, Nazwa: Pizza, Cena: 22.0 PLN, Nazwa: Spaghetti, Cena: 15.0 PLN, Nazwa: Skrzydełka z kurczaka, Cena: 12.5 PLN, Nazwa: Owoce morza, Cena: 28.2 PLN, Nazwa: Kebab, Cena: 17.5 PLN, Nazwa: Coca-Cola, Cena: 4.2 PLN, Nazwa: Woda, Cena: 1.5 PLN, Nazwa: Piwo, Cena: 5.0 PLN, Nazwa: Sok, Cena: 3.0 PLN, Nazwa: Wino, Cena: 15.0 PLN] Test 2
BUILD SUCCESSFUL (total time: 0 seconds)

@kixe52
Po dodaniu linii

System.out.println(Arrays.toString(tab)+("  tab"));

wyswietla ze wysyła indeksy tak jak pokazane niżej czyli raczej poprawnie bo zaznaczylem buttony 1,3,4,9,11

[0, 2, 3, 8, 10] tab

1

https://i.imgur.com/9Q04POm.png

  1. Products wypełniasz z poziomu maina z Restaurants, a to nie jest używane w ogóle jeśli aplikację odpalasz z poziomu jFrame.

Dlatego jak widzisz na obrazku powyżej, nic tam nie ma, przez co products.get(0) zwraca exception.
Pomyśl co z tym zrobić :)

  1. Dodatkowo po zaznaczeniu 4 pierwszych checkboxow dostaje indeksy: 0, 1, 2, 4 zamiast 0, 1, 2, 3. Poszukaj co robisz źle.

  2. NO I NAJWAŻNIEJSZE. JAK OCZEKUJESZ POMOCY TO POSTARAJ SIĘ LUDZIOM DOSTARCZYĆ TO CZEGO CHCĄ. NIE UCINAJ SCREENÓW, BO NIE WIADOMO W KTÓREJ KLASIE WYWOŁUJESZ KOD. A JAK KTOŚ PROSI ABYŚ WRZUCIŁ KOD NA GITA TO WRZUĆ CAŁA STRUKTURĘ SWOJEGO PROJEKTU, A NIE PO PROSTU UPLOADOWAŁEŚ WYBRANE KLASY.
    ZMARNOWAŁEM 10 MIN NA ZBUDOWANIE PROJEKTU :)

0

Dzięki wielkie, wiem już w takim razie co poprawić i przepraszam, nie pomyślałem z tym gitem :/

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