2016-07-11 3 views
0

im пытается нарисовать вертикальные и горизонтальные линии между случайно выбранными точками на сетке и заданными точками из списка точек. Моя кодировка в стиле новичка, похоже, сказывается на приложении, которое раздавливается после того, как я нажимаю случайную точку на сетке. то он выбрасывает следующий OOME. Софар, я пытался увеличить кучу. Это совсем не помогло .. любые идеи? вот фрагмент кода, который вызывает it.i've ГНФАР только написанный код для случая события щелчка к востоку от точки из спискаКак обрабатывать исключение OOME, если увеличение размера кучи не работает?

@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(); 
        } 
       } 
      } 
     } 
    } 
} 

и здесь исключение:

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

Не могли бы вы показать нам код, который вызывает ошибку? Например. что происходит в 'GUIs.GameField.mouseClicked()' –

+0

Может иметь много причин. Возможно, у вас есть логическая ошибка и вы пытаетесь создать большой массив ArrayList, который вы не хотите создавать. Возможно, вы просто написали неэффективный код. Нам действительно нужен код, связанный с исключением. – Zabuza

+0

'Мое кодирование в стиле новичка '- не видя этого, это очень сложно. –

ответ

1

Проблема, кажется, в самом внутреннем цикле в пределах GameField.mouseClicked(). Когда crossingLines оценивает до false, вы потенциально добавляете много предметов в lineList, потому что lineList.add() находится в пределах цикла lineList. Похоже, что crossingLines в настоящее время не оценивает true, и список продолжает расширяться до тех пор, пока у вас не закончится память.

Чтобы устранить эту проблему, вам следует как-то убедиться, что lineList.add() не вызывается постоянно. Кроме того, я бы предложил вам пересмотреть структуру mouseClicked(). В настоящее время у вас есть три (!) Вложенных цикла for-loops в методе, и вы также вызываете repaint() в среднем цикле, что может вызвать некоторые ненужные мерцания, в зависимости от размера pointList.

 Смежные вопросы

  • Нет связанных вопросов^_^