java - I get hit with "Comparison method violates its general contract!" exception when I create/add more than a certain number of objects -
i'm learning java @ college , assignment. task create x y grid of color squares each run in separate thread , every k ms either change it's color random 1 or average color of it's neighbours.
now, if create 30 30 grid runs fine. however, if try 40 40, following exception once when app starts , once when close it. apart appears run correctly, although grid appears positioned within window wrongly (it's narrower should be).
exception in thread "awt-eventqueue-0" java.lang.illegalargumentexception: comparison method violates general contract! @ java.util.timsort.mergelo(timsort.java:747) @ java.util.timsort.mergeat(timsort.java:483) @ java.util.timsort.mergecollapse(timsort.java:410) @ java.util.timsort.sort(timsort.java:214) @ java.util.timsort.sort(timsort.java:173) @ java.util.arrays.sort(arrays.java:659) @ java.util.collections.sort(collections.java:217) @ javax.swing.sortingfocustraversalpolicy.enumerateandsortcycle(sortingfocustraversalpolicy.java:136) @ javax.swing.sortingfocustraversalpolicy.getfocustraversalcycle(sortingfocustraversalpolicy.java:110) @ javax.swing.sortingfocustraversalpolicy.getfirstcomponent(sortingfocustraversalpolicy.java:435) @ javax.swing.layoutfocustraversalpolicy.getfirstcomponent(layoutfocustraversalpolicy.java:166) @ javax.swing.sortingfocustraversalpolicy.getdefaultcomponent(sortingfocustraversalpolicy.java:515) @ java.awt.focustraversalpolicy.getinitialcomponent(focustraversalpolicy.java:169) @ java.awt.defaultkeyboardfocusmanager.dispatchevent(defaultkeyboardfocusmanager.java:380) @ java.awt.component.dispatcheventimpl(component.java:4731) @ java.awt.container.dispatcheventimpl(container.java:2287) @ java.awt.window.dispatcheventimpl(window.java:2719) @ java.awt.component.dispatchevent(component.java:4687) @ java.awt.eventqueue.dispatcheventimpl(eventqueue.java:729) @ java.awt.eventqueue.access$200(eventqueue.java:103) @ java.awt.eventqueue$3.run(eventqueue.java:688) @ java.awt.eventqueue$3.run(eventqueue.java:686) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:87) @ java.awt.eventqueue$4.run(eventqueue.java:702) @ java.awt.eventqueue$4.run(eventqueue.java:700) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.awt.eventqueue.dispatchevent(eventqueue.java:699) @ java.awt.sequencedevent.dispatch(sequencedevent.java:128) @ java.awt.eventqueue.dispatcheventimpl(eventqueue.java:727) @ java.awt.eventqueue.access$200(eventqueue.java:103) @ java.awt.eventqueue$3.run(eventqueue.java:688) @ java.awt.eventqueue$3.run(eventqueue.java:686) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:87) @ java.awt.eventqueue$4.run(eventqueue.java:702) @ java.awt.eventqueue$4.run(eventqueue.java:700) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.awt.eventqueue.dispatchevent(eventqueue.java:699) @ java.awt.eventdispatchthread.pumponeeventforfilters(eventdispatchthread.java:242) @ java.awt.eventdispatchthread.pumpeventsforfilter(eventdispatchthread.java:161) @ java.awt.eventdispatchthread.pumpeventsforhierarchy(eventdispatchthread.java:150) @ java.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:146) @ java.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:138) @ java.awt.eventdispatchthread.run(eventdispatchthread.java:91)
here's code: main class symulacja:
import java.awt.borderlayout; import java.awt.gridlayout; import javax.swing.jframe; import javax.swing.jpanel; import java.util.random; // main class @suppresswarnings("serial") public class symulacja extends jpanel { public symulacja(int x, int y, int k, double p) { super(); field.delay = k; field.p = p; field.random = new random(); setlayout(new gridlayout(y, x)); //creating field objects , adding them panel field fv[][] = new field[y][]; (int = 0; i<y; i++){ fv[i] = new field[x]; (int j = 0; j<x; j++){ fv[i][j] = new field(); add(fv[i][j]); } } //setting neighbours in field objects (int = 0; i<y; i++){ (int j = 0 ; j<x; j++){ field fv2[] = {fv[(i+1)%y][j], fv[(i+y-1)%y][j], fv[i][(j+1)%x], fv[i][(j+x-1)%x]}; fv[i][j].setarr(fv2); } } //starting threads (int = 0; i<y; i++){ (int j = 0 ; j<x; j++){ new thread(fv[i][j]).start(); } } } public static void main(string[] args) { symulacja s = new symulacja(30,30,100,0); //works //symulacja s = new symulacja(40,40,100,0); //throws exception jframe f = new jframe(); f.setlayout(new borderlayout()); f.add(s, borderlayout.center); f.setdefaultcloseoperation(jframe.exit_on_close); f.setvisible(true); f.setsize(400, 400); } }
the field class (a single grid element):
import java.awt.canvas; import java.awt.color; import java.awt.graphics; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.util.random; @suppresswarnings("serial") class field extends canvas implements runnable { field() { color = nextint(); randflag = false; //zmiana koloru na losowy po kliknięciu myszą addmouselistener(new mouseadapter() { public void mouseclicked(mouseevent e) { randflag = true; } }); } void setarr(field[] a) { fieldarr = a; } public void run() { while (true){ double rand = nextdouble(); int newcolor; if (rand <= p || randflag){ // losowy kolor lub kliknięcie myszą newcolor = nextint(); randflag = false; } else{ // uśredniony kolor newcolor = 0; (field f: fieldarr) newcolor+=f.getcolor()/4; } if (newcolor!=getcolor()){ setcolor(newcolor); repaint(); } try { thread.sleep((long)((nextdouble() + 0.5)*delay)); } catch (interruptedexception e) { return; } } } public void paint(graphics g) { g.setcolor(new color(getcolor())); g.fillrect(0, 0, getwidth(), getheight()); g.dispose(); } synchronized public int getcolor() { return color; } synchronized private void setcolor(int color) { this.color = color; } private int nextint() { synchronized (random) { return random.nextint(); } } private double nextdouble() { synchronized (random) { return random.nextdouble(); } } static public int delay; static public double p; field fieldarr[]; private int color; boolean randflag; static random random; }
it comparator error, , may here:
if (rand <= p || randflag)
where rand
never initialized new random. try
rand = new random();
before calling nextdouble().
edit.
beware of use of nextdouble(). give value between 0,0 , 1,0.
Comments
Post a Comment