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

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -