代码之家  ›  专栏  ›  技术社区  ›  melar

如果增加堆的大小不起作用,如何处理OOME异常?

  •  0
  • melar  · 技术社区  · 8 年前

    im试图在网格上随机单击的点和点列表中给定的点之间绘制垂直和水平线。我的新手风格的编码似乎对我点击网格上的一个随机点后崩溃的应用程序产生了影响。然后抛出以下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)
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Mick Mnemonic    8 年前

    问题似乎出现在 GameField.mouseClicked() 什么时候 crossingLines 计算结果为 false ,您可能会在中添加许多项目 lineList 因为 lineList.add() 线条列表 它本身所以看起来 交叉线 当前从未计算为 true 列表会不断扩展,直到内存耗尽。

    为了解决这个问题,你应该确保 不会连续被呼叫。此外,我建议您重新考虑 mouseClicked() 。目前,您有三个(!)在方法中嵌套for循环,并且您还调用 repaint() 在中间循环中,这可能会导致一些不必要的闪烁,具体取决于 pointList .