使用异常时,LWJGL“位置的内存访问无效”

时间:2014-09-14 20:46:54

标签: java lwjgl

我开始玩LWJGL。我采取了this sample code,这很好。然后,我想改变循环停止的方式。这是我的新代码"而"循环:

while (true) {
        // Clear the screen and depth buffer
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);  

        // set the color of the quad (R,G,B,A)
        GL11.glColor3f(0.5f,0.5f,1.0f);

        // draw quad
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(100,100);
        GL11.glVertex2f(100+200,100);
        GL11.glVertex2f(100+200,100+200);
        GL11.glVertex2f(100,100+200);
        GL11.glEnd();

        Display.update();

        if(Display.isCloseRequested()) {
            Display.destroy();
            throw new Exception("Normal termination");
        }
  }

这次抛出异常以退出循环。 "开始"抛出异常,我的主要"如下:

public static void main(String[] argv) {
        QuadExample quadExample = new QuadExample();
        try {
            quadExample.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

使用这个新结构,程序崩溃并出现错误:

Invalid memory access of location 0x0 rip=0x7fff86d8cf0c

而不是在关闭它时正确终止。

有关信息,我在Mac OS X 10.6.7上使用JavaSE-1.6运行它。 我看到了类似的问题here,并尝试使用-Xint。它解决了这个问题。知道没有-Xint会出现什么问题吗?

2 个答案:

答案 0 :(得分:0)

虽然我无法回答问题究竟是什么问题,但我可以提出一个解决方法:

boolean continue = true;
while (continue ) {
   //GL code
    Display.update();
    if(Display.isCloseRequested()) {
      continue = false;
    }
}
Display.destroy();
throw new Exception("Normal termination");

这应该有希望阻止循环的优化,以便为销毁的显示调用GL命令。

答案 1 :(得分:0)

我仍然不知道我的代码究竟出了什么问题,但我找到了一个解决方法:放置Display.destroy();在捕获异常之后而不是在抛出它之前。所以主要功能如下:

public static void main(String[] argv) {
    QuadExample quadExample = new QuadExample();
    try {
        quadExample.start();
    } catch (Exception e) {
        Display.destroy(); // destroying the display here now
        e.printStackTrace();
    }
}

我不知道Display类的内部或者LWJGL的工作方式,但我的猜测是Display.destroy异步执行某些事情,当抛出异常时它没有完成,导致以后的内存访问不良。