Permalänk
Medlem

Mängder av körfel i Java

Hej Sweclockers!

Såhär ligger det till: jag går just nu en kurs i programmering, detta som rubriken antyder i Java.
För att kunna lösa diverse inlämningsuppgifter utanför skolan har jag installerat Java på min laptop.
Problemet: Jag tror att något är fel i installationen. När jag genom kommandot

java "Class"

kör min kod får jag stora mängder felmeddelanden. Notera att detta inte sker alltid utan ibland är det varje gång, ibland var tredje osv. Vad jag kunnat uppfatta sker det helt slumpmässigt.
Jag är inte helt haj på att tyda felmeddelanden i kommandotolken så om någon vänlig själ kunnat ta en titt på dem hade jag blivit väldigt tacksam!

Felkoden:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException at javax.swing.LayoutComparator.compare(Unknown Source) at javax.swing.LayoutComparator.compare(Unknown Source) at java.util.TimSort.binarySort(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source) at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source) at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source) at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.SequencedEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Dold text

Såhär ser felmeddelandena ut.
Jag sitter på Windows 8 64 bit, installationsmappen för java är "C:\Program Files\Java\jdk1.7.0_17". I en undermapp "lib" finns även ett för kursen utformat kurspaket med diverse klasser.

Som sagt, felmeddelandena säger mig i princip ingenting så om någon har råd till vad som kan vara fel tas detta emot med stor tacksamhet!

Mvh Fredrik

Permalänk

Hur ser din kod ut?

Permalänk
Medlem
Permalänk
Medlem

Har du kompilerat först?

Permalänk
Medlem
Skrivet av Formel117:

Hur ser din kod ut?

Jag skriver just nu ett Snake-spel men jag har fått samma fel på den förra uppgiften, de båda uppgifterna använda samma klass för att starta spelet i ett nytt fönster.

Min kod (ej färdig):

import se.lth.cs.pt.dots.events.DotWindow; import se.lth.cs.pt.dots.Color; import se.lth.cs.pt.dots.events.GameEvent; import se.lth.cs.pt.io.Keyboard; import java.util.*; class Snake { public static void main(String[] args) { new Snake().run(); } DotWindow w; Runner runner; List<int[]> tail = new LinkedList<int[]>(); int tailLength; void run() { setup(); int tickCount = 0; dance: while (true) { GameEvent event = w.getNextEvent(); switch (event.getKind()) { case GameEvent.TICK: tickCount++; if(tickCount%10==0) { tailLength++; } System.out.println("TICK"); manageTail(runner.getPos()); runner.forward(); if (youHitSomething()) { paintRed(runner.getPos()); break dance; } paintRed(runner.getPos()); break; case GameEvent.KEY_PRESSED: switch (event.getKey()) { case 'a': System.out.println("VÄNSTER"); runner.turnLeft(); break; case 'd': System.out.println("HÖGER"); runner.turnRight(); break; } } } } void manageTail(int[] input) { tail.addFirst(input); paintBlue(tail.get(0)); paintWhite(tail.getLast()); tail.removeLast(); } void paintTail() { for (int[] coordinate : tail) { paintBlue(coordinate); } //paintWhite(tail.get(tailLength-1)); } boolean youHitSomething() { if (!w.getDot(runner.getPos()[0], runner.getPos()[1]).equals(Color.WHITE)) { return true; } return false; } void paintRed(int[] input) { w.setDot(input[0], input[1], Color.RED); } void paintBlue(int[] input) { w.setDot(input[0], input[1], Color.BLUE); } void paintWhite(int[] input) { w.setDot(input[0], input[1], Color.WHITE); } void setup() { int size = Keyboard.nextInt("Ange storlek! "); int speed = 100; w = new DotWindow(size, size, 10); w.setAutoUpdate(false); for (int k = 0; k<size; k++) { w.setDot(k, 0, Color.BLACK); w.setDot(k, size-1, Color.BLACK); w.setDot(0, k, Color.BLACK); w.setDot(size-1, k, Color.BLACK); } runner = new Runner(size); w.setDot(runner.getX(), runner.getY(), Color.RED); w.timeStep(speed); w.checkKeys(true, false, false); w.update(); w.setAutoUpdate(true); } } class Runner { private int xPos; private int yPos; private int direction; private int[] coordinates = new int[2]; public Runner (int size) { xPos = size/2; yPos = size/2; direction = 1; updateCoordinates(); } public int getX () { return xPos; } public int getY () { return yPos; } public int[] getPos() { return coordinates; } public void turnRight () { if (direction==1) { direction=4; } else { direction--; } } public void turnLeft () { if (direction==4) { direction=1; } else { direction++; } } public void forward () { switch (direction) { case 1: xPos++; break; case 2: yPos--; break; case 3: xPos--; break; case 4: yPos++; break; } updateCoordinates(); } private void updateCoordinates() { coordinates[0] = xPos; coordinates[1] = yPos; } }

Dold text
Skrivet av Eob:

Har du kompilerat först?

Ja

Det här kan ju stämma, men varför får jag felmeddelande bara ibland när jag kör exakt samma kod?

Tack så mycket för snabba svar!

Permalänk
Medlem
Skrivet av Andreen:

Jag skriver just nu ett Snake-spel men jag har fått samma fel på den förra uppgiften, de båda uppgifterna använda samma klass för att starta spelet i ett nytt fönster.

Min kod (ej färdig):

import se.lth.cs.pt.dots.events.DotWindow; import se.lth.cs.pt.dots.Color; import se.lth.cs.pt.dots.events.GameEvent; import se.lth.cs.pt.io.Keyboard; import java.util.*; class Snake { public static void main(String[] args) { new Snake().run(); } DotWindow w; Runner runner; List<int[]> tail = new LinkedList<int[]>(); int tailLength; void run() { setup(); int tickCount = 0; dance: while (true) { GameEvent event = w.getNextEvent(); switch (event.getKind()) { case GameEvent.TICK: tickCount++; if(tickCount%10==0) { tailLength++; } System.out.println("TICK"); manageTail(runner.getPos()); runner.forward(); if (youHitSomething()) { paintRed(runner.getPos()); break dance; } paintRed(runner.getPos()); break; case GameEvent.KEY_PRESSED: switch (event.getKey()) { case 'a': System.out.println("VÄNSTER"); runner.turnLeft(); break; case 'd': System.out.println("HÖGER"); runner.turnRight(); break; } } } } void manageTail(int[] input) { tail.addFirst(input); paintBlue(tail.get(0)); paintWhite(tail.getLast()); tail.removeLast(); } void paintTail() { for (int[] coordinate : tail) { paintBlue(coordinate); } //paintWhite(tail.get(tailLength-1)); } boolean youHitSomething() { if (!w.getDot(runner.getPos()[0], runner.getPos()[1]).equals(Color.WHITE)) { return true; } return false; } void paintRed(int[] input) { w.setDot(input[0], input[1], Color.RED); } void paintBlue(int[] input) { w.setDot(input[0], input[1], Color.BLUE); } void paintWhite(int[] input) { w.setDot(input[0], input[1], Color.WHITE); } void setup() { int size = Keyboard.nextInt("Ange storlek! "); int speed = 100; w = new DotWindow(size, size, 10); w.setAutoUpdate(false); for (int k = 0; k<size; k++) { w.setDot(k, 0, Color.BLACK); w.setDot(k, size-1, Color.BLACK); w.setDot(0, k, Color.BLACK); w.setDot(size-1, k, Color.BLACK); } runner = new Runner(size); w.setDot(runner.getX(), runner.getY(), Color.RED); w.timeStep(speed); w.checkKeys(true, false, false); w.update(); w.setAutoUpdate(true); } } class Runner { private int xPos; private int yPos; private int direction; private int[] coordinates = new int[2]; public Runner (int size) { xPos = size/2; yPos = size/2; direction = 1; updateCoordinates(); } public int getX () { return xPos; } public int getY () { return yPos; } public int[] getPos() { return coordinates; } public void turnRight () { if (direction==1) { direction=4; } else { direction--; } } public void turnLeft () { if (direction==4) { direction=1; } else { direction++; } } public void forward () { switch (direction) { case 1: xPos++; break; case 2: yPos--; break; case 3: xPos--; break; case 4: yPos++; break; } updateCoordinates(); } private void updateCoordinates() { coordinates[0] = xPos; coordinates[1] = yPos; } }

Dold text

Det här kan ju stämma, men varför får jag felmeddelande bara ibland när jag kör exakt samma kod?

Anledningen till att det uppstår ibland är att antigen en if eller case sats blir uppfylld där den felaktiga koden finns. Har kollat lite snabbt i koden kan inte se något. Vet inte hur du kör din kod men jag brukar få utskrivet var felet upstog(vilken rad).

Permalänk
Medlem
Skrivet av Andreen:

... Som sagt, felmeddelandena säger mig i princip ingenting så om någon har råd till vad som kan vara fel tas detta emot med stor tacksamhet!

Mvh Fredrik

Det är något fel i Event-slingan för ditt GUI. Förmodligen hinner det inte initialisera färdigt innan du kollar första eventet vid GameEvent event = w.getNextEvent();. Då problemet inte uppenbarar sig varje gång gissar jag att det har en initialiseringsrutin som körs parallellt någon gång efter att ditt DotWindow-objekt har skapats. Du kan verifiera detta genom att lägga in Thread.sleep(1000); i slutet av din setup()-metod; om problemet då minimeras eller försvinner helt behöver du vänta på någon form av callback från DotWindow för att veta när du kan börja hämta events.

edit:

Problemet beskrivs här: http://www.artima.com/forums/flat.jsp?forum=1&thread=173906
samt här: http://stackoverflow.com/questions/2966552/classcastexception...

Det är mycket riktigt något med UI-tråden men inte anknutet till getNextEvent().

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Kör en debug på koden, så lär du hyfsat enkelt hitta var det strular.

Permalänk
Medlem

Hej igen!

Tack så mycket för alla svar!
Jag testade lägga in Thread.sleep(1000) i slutet av setup() som föreslogs, vad som hände då var att ingenting händer på 1 sekund, därefter hoppar "ormen" steg motsvarande en sekund framåt men problemen kvarstår. Jag kan styra den ibland och ibland inte (kan styra då jag inte får felmeddelanden och vice versa).

Hur kör jag debug på koden?

Jag läser bara grundkurs i Java så jag ber om ursäkt för eventuellt dumma frågor och missförstånd.

Mvh Fredrik

Edit: Kanske ska beskriva vad som händer i mitt spelfönster också. Ormen kommer alltid fram och målar ut vägen, problemet är att jag de gånger jag får felmeddelanden inte kan styra den. Fel i den "undre" switch-satsen?

Permalänk
Medlem
Skrivet av Andreen:

Hej igen!

Tack så mycket för alla svar!
Jag testade lägga in Thread.sleep(1000) i slutet av setup() som föreslogs, vad som hände då var att ingenting händer på 1 sekund, därefter hoppar "ormen" steg motsvarande en sekund framåt men problemen kvarstår. Jag kan styra den ibland och ibland inte (kan styra då jag inte får felmeddelanden och vice versa).

Hur kör jag debug på koden?

Jag läser bara grundkurs i Java så jag ber om ursäkt för eventuellt dumma frågor och missförstånd.

Mvh Fredrik

Edit: Kanske ska beskriva vad som händer i mitt spelfönster också. Ormen kommer alltid fram och målar ut vägen, problemet är att jag de gånger jag får felmeddelanden inte kan styra den. Fel i den "undre" switch-satsen?

Antar att ni använder Eclipse, då det var vad jag programmerade i i grundkursen på LTH. I så fall skapa en breakpoint någonstans i koden där du vill debugga ifrån. Du skapar en sådan genom att högerklicka i "marginalen" (där det kommer meddelande om det är fel i koden).
Här:
http://gyazo.com/299bcf24e1886046177f06da700a4cf6
Tryck sedan på ikonen vänster om "kör" ikonen (ser ut som ett kryp).
http://gyazo.com/601b4b3312e609d8947f669dfb7d9a24

Sedan väl i dubuggern hoppar du fram i koden genom de gula pilarna:
Den ena gör att du hoppar in i metoder, medan med den andra hoppar du över metoder.
http://gyazo.com/775a095a3e23123bd7ca42f0c3e7eb46