Avatar billede riversen Nybegynder
07. maj 2003 - 16:38 Der er 20 kommentarer og
1 løsning

Exception

Hvad vil følgende helt nøjagtigt sige:
java.lang.ArrayIndexOutOfBoundsException: 47 >= 41

47 >= 41 ????

Jeg får følgende stacktrace:
java.lang.ArrayIndexOutOfBoundsException: 47 >= 41

    at java.util.Vector.elementAt(Vector.java:427)

    at javax.swing.JList$5.getElementAt(JList.java:1251)

    at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1146)

    at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1097)

    at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:280)

    at javax.swing.JComponent.getPreferredSize(JComponent.java:1272)

    at java.awt.GridBagLayout.GetLayoutInfo(GridBagLayout.java:892)

    at java.awt.GridBagLayout.getLayoutInfo(GridBagLayout.java:806)

    at java.awt.GridBagLayout.ArrangeGrid(GridBagLayout.java:1373)

    at java.awt.GridBagLayout.arrangeGrid(GridBagLayout.java:1336)

    at java.awt.GridBagLayout.layoutContainer(GridBagLayout.java:706)

    at java.awt.Container.layout(Container.java:1017)

    at java.awt.Container.doLayout(Container.java:1007)

    at java.awt.Container.validateTree(Container.java:1089)

    at java.awt.Container.validateTree(Container.java:1096)

    at java.awt.Container.validate(Container.java:1064)

    at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353)

    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:116)

    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

i forbindelse med
    while ( clients.size() > 0 )
      unregisterClient( (ClientWorker) clients.lastElement() );

unregisterclient fjerne clientworker fra clients (som er en vector).

clientworker er en tråd, samt objektet hvor while løkken køres. Jeg tænker at det må være et samtidighedsproblem pga. de mange tråde, men jeg benytter kun de synkronizerede metoder i Vector.

Håber nogen kan lede mig på rette vej.
Avatar billede arne_v Ekspert
07. maj 2003 - 16:48 #1
Det lyder som om du bruger element nummer 47 i et array med 41 elementer.
Avatar billede disky Nybegynder
07. maj 2003 - 16:49 #2
Du forsøger at hente element nummer 47 fra en Vector hvor der kun er 41 elementer.

Dette resulterer i den exception du får.
Avatar billede riversen Nybegynder
07. maj 2003 - 16:50 #3
nogen gange siger den fx 45 >= 45...

og som sagt..jeg bruger synchronized metoder
Avatar billede riversen Nybegynder
07. maj 2003 - 16:51 #4
disky: hvordan det, hvis jeg bruger synchronized metoder? hvis jeg selv laver synchronized hvor jeg piller ved clients, ændrer det intet
Avatar billede riversen Nybegynder
07. maj 2003 - 16:52 #5
jeg kan godt maile lidt kode, hvis det er, men ved ikke, om det er for bøvlet at sætte sig ind i...
Avatar billede arne_v Ekspert
07. maj 2003 - 16:52 #6
Vector er synchronized men det betyder kun at at et enkelt metode
kald ikke korrumperer data-strukturen.

while ( clients.size() > 0 )
      unregisterClient( (ClientWorker) clients.lastElement() );

kan sagtens give fejl i et multithreaded miljø.

Der er et element tilbage.
Denne her tråd konstaterer at size() > 0.
En anden tråd fjerner elementet.
Denne tråd kalder lastElement().
Avatar billede arne_v Ekspert
07. maj 2003 - 16:53 #7
Du kan evt. prøve med:

synchronized(clients) {
  while ( clients.size() > 0 )
      unregisterClient( (ClientWorker) clients.lastElement() );
}

og også bruge:

synchronized(clients) {
}

omkring alle de andre steder hvor clients ændres.
Avatar billede riversen Nybegynder
07. maj 2003 - 16:55 #8
arne_v: det synes jeg bare jeg har gjort... + jeg er 99 % sikker på der kun er en tråd der tilgår clients
Avatar billede riversen Nybegynder
07. maj 2003 - 16:57 #9
ah, nok ikke helt alligevel...leger lige med det
Avatar billede riversen Nybegynder
07. maj 2003 - 16:59 #10
java.lang.ArrayIndexOutOfBoundsException: 31 >= 31

    at java.util.Vector.elementAt(Vector.java:427)

    at javax.swing.JList$5.getElementAt(JList.java:1251)

    at javax.swing.plaf.basic.BasicListUI.paintCell(BasicListUI.java:122)

    at javax.swing.plaf.basic.BasicListUI.paint(BasicListUI.java:215)

    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)

    at javax.swing.JComponent.paintComponent(JComponent.java:541)

    at javax.swing.JComponent.paint(JComponent.java:808)

    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4771)

    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4724)

    at javax.swing.JComponent._paintImmediately(JComponent.java:4668)

    at javax.swing.JComponent.paintImmediately(JComponent.java:4477)

    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)

    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)

    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

men hvorfor er det ikke noget trace tilbage til min kode også ?
Avatar billede arne_v Ekspert
07. maj 2003 - 17:02 #11
Vel fordi at det sker i en tråd hvor der ikke er noget af din kode.

[men som bruger noget af dit data]
Avatar billede riversen Nybegynder
07. maj 2003 - 17:08 #12
hvad kan jeg så gøre ved det?
Avatar billede riversen Nybegynder
07. maj 2003 - 17:12 #13
har lavet det om til et array og får stadig fejlen, så det må være et andet sted i koden. Jeg har jo også en vector andetsteds, så kigger lige der lidt
Avatar billede arne_v Ekspert
07. maj 2003 - 17:18 #14
Så du har en Vector - du har lavet en JList baseret på den - og det
går galt når du fjerner fra den Vector og Swing koden forsøger at repainte ?

Ikke ligefrem mit ekspertsie område.

To gæt:

1)  Prøv og kald setListData på JList'en efter ændringerne

2)  Prøv og kald fireSelectionValueChanged på JList'en efter ændringerne
Avatar billede riversen Nybegynder
07. maj 2003 - 17:27 #15
tror jeg har fundet stedet nu:

  public synchronized void addUser( String user )
  {
    vCurrentUsers.addElement( user );
    currentUsers.setListData( vCurrentUsers );
  }
 
  public synchronized void removeUser( String user )
  {
    vCurrentUsers.removeElement( user );
    currentUsers.setListData( vCurrentUsers );
  }

kan det passe en tråd (en clientworker) når at fjerne et element inden JList er færdig med at opdatere fra et tidligere kald? I så fald...hvad så ?
Avatar billede arne_v Ekspert
07. maj 2003 - 17:35 #16
Hm.

Hvis jeg læser:
  http://developer.java.sun.com/developer/technicalArticles/Threads/swing/
korrekt så er Swing i et ægte multi-threaded environment ikke helt nemt !
Avatar billede riversen Nybegynder
07. maj 2003 - 17:39 #17
det hjælper i hvert fald hvis jeg sætter den til at sleepe lidt efter der er fjernet noget fra listen. Så kommer der ingen fejl.

Men nu hvor metoderne er synkroniserede fryser gui'en en gang imellem :-)
Avatar billede riversen Nybegynder
07. maj 2003 - 17:53 #18
hvis jeg kloner min vector så kører det! skønt...

så må vi se om jeg finder ud af hvorfor synkroniseringen af de 2 metoder ødelægger gui'en
Avatar billede riversen Nybegynder
07. maj 2003 - 17:54 #19
arne: læg svar for point
Avatar billede arne_v Ekspert
07. maj 2003 - 18:23 #20
svar
Avatar billede arne_v Ekspert
07. maj 2003 - 18:25 #21
Jeg formoder at clone gør at Swing kan gøre færdig på den gamle
kopi.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester