2016-07-11 4 views
0

Ich versuche, vertikale und horizontale Linien zwischen zufällig ausgewählten Punkten auf einem Gitter und gegebenen Punkten aus einer Liste von Punkten zu zeichnen. Meine Newbie-Stil-Codierung scheint ihren Tribut in der App zu nehmen, die nach dem Klicken auf einen zufälligen Punkt auf dem Gitter zerbricht. dann wirft es das folgende OOME. Ich habe versucht, die Größe zu erhöhen. Das hat überhaupt nicht geholfen. irgendwelche Ideen ?? hier ist der Code-Schnipsel, dass it.i've sofar nur geschrieben Code für den Fall eines Click-Ereignisses im Osten von einem Punkt aus der ListeWie OOME-Ausnahme behandeln, wenn die Größe des Heap nicht funktioniert?

@Override 
public void mouseClicked(MouseEvent e) { 
    boolean crossingLines = false; 
    Line l; 
    Point p = new Point(e.getX(), e.getY()); 
    for (int i = 0; i < pointList.size(); i++) { 
     Rectangle rec = new Rectangle(pointList.get(i).x 
       * GAPBETWEENPOINTS 
       + GAP 
       - TOLERANCE, pointList.y 
       * GAPBETWEENPOINTS 
      + GAP 
       - TOLERANCE,TOLERANCE * 2, 
       CLICKTOLERANCE * 2); 
     if (rec.contains(p)) { 
      if (clickedEast(p, pointList.get(i)) == true) { 
       for (int j = i + 1; j < pointList.size(); j++) { 
        if (pointList.get(j).y 
          * GAPBETWEENPOINTS 
          + GAP == pointList.get(i).y 
            * GAPBETWEENPOINTS 
            + GAP 
          && pointList.get(j).x 
          * GAPBETWEENPOINTS 
          + GAP > pointList.get(i).x 
          * GAPBETWEENPOINTS 
          + GAP) { 
         l = new Line(pointList.get(i), 
           pointList.get(j)); 
         if (!lineList.contains(b)) { 

          for (int k = 0; k < lineList.size(); k++) { 
           if (lineList.get(k).getHorizontal() == false) { 
            if (pointList.get(i).x 
              * GAPBETWEENPOINTS 
              + GAP < lineList 
              .get(k).getStartPoint().x 
              && lineList.get(k) 
                .getStartPoint().x < pointList.get(j).x 
                * GAPBETWEENPOINTS 
                + GAP 
              && lineList.get(k) 
                .getStartPoint().y < pointList.get(i)).y 
                * GAPBETWEENPOINTS 
                + GAP 
              && pointList.get(k).y 
              * GAPBETWEENPOINTS 
              + GAP < lineList 
                .get(k).getEndPoint().y) { 
             crossinglines = true; 
            } 
           } 

           if (crossingLines == false) { 
            lineList.add(b); 
           } 
          } 
         } 
         validate(); 
         repaint(); 
        } 
       } 
      } 
     } 
    } 
} 

und hier verursacht die Ausnahme:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java 
heap space 
at java.util.Arrays.copyOf(Arrays.java:2245) 
at java.util.Arrays.copyOf(Arrays.java:2219) 
at java.util.ArrayList.grow(ArrayList.java:242) 
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216) 
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208) 
at java.util.ArrayList.add(ArrayList.java:440) 
at GUIs.GameField.mouseClicked(GameField.java:326) 
at java.awt.Component.processMouseEvent(Component.java:6519) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6281) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4872) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4698) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4698) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747) 
at java.awt.EventQueue.access$300(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:706) 
at java.awt.EventQueue$3.run(EventQueue.java:704) 
at java.security.AccessController.doPrivileged(Native Method) 
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain. 
java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain. 
java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:720) 
at java.awt.EventQueue$4.run(EventQueue.java:718) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain. 
java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:717) 
+2

Können Sie uns Code zeigen, der den Fehler verursacht? Z.B. Was passiert in 'GUIs.GameField.mouseClicked()' –

+0

Könnte viele Gründe haben. Vielleicht haben Sie einen logischen Fehler und versuchen, eine große "ArrayList" zu erstellen, die Sie nicht erstellen möchten. Vielleicht hast du gerade ineffizienten Code geschrieben. Wir brauchen wirklich etwas von deinem Code, der mit der Ausnahme zusammenhängt. – Zabuza

+0

'My newbie style coding' - ohne dies zu sehen, ist es schwer zu helfen. –

Antwort

1

Das Problem scheint in der innersten Schleife innerhalb GameField.mouseClicked() zu sein. Wenn crossingLines zu false auswertet, fügen Sie potenziell viele Elemente in lineList hinzu, da lineList.add() innerhalb der Schleife über lineList selbst liegt. So scheint es, dass crossingLines derzeit nie true auswertet und die Liste erweitert, bis Sie nicht mehr genügend Arbeitsspeicher haben.

Um das Problem zu beheben, sollten Sie sicherstellen, dass nicht ständig aufgerufen wird. Außerdem würde ich vorschlagen, dass Sie die Struktur von mouseClicked() überdenken. Derzeit haben Sie drei (!) Verschachtelte for-Schleifen in der Methode und Sie rufen auch repaint() innerhalb der mittleren Schleife, was zu einigen unnötigen Flackern führen kann, abhängig von der Größe von pointList.

Verwandte Themen