2016-06-26 2 views
1

Примечание для закрытия избирателей с зудящими триггерными пальцами - это НЕ дубликат «Что такое исключение NullPointerException». Прочтите весь вопрос до голосования, чтобы закрыть его.GL.createCapabilities throws NullPointerException


Я сделал класс для создания окна с использованием библиотеки LWJGL3. Я пытаюсь создать окно в модульном тесте с этим классом, но он выдает исключение NullPointerException при вызове метода GL.createCapabilities(). Я использую Intellij IDEA с gradle и Debian 8.

Это не дубликат того, что является NullPointerException, поскольку я пытаюсь найти причину, по которой библиотека LWJGL3 выбрасывает это исключение, и я знаю, что это такое исключение.

Я уже искал в Google, и я не нашел, почему это может произойти. Я попытался удалить пакет libgl1-mesa-dev, и он не сработал.

Это трассировка стека.

java.lang.NullPointerException 
     at java.util.regex.Matcher.getTextLength(Matcher.java:1283) 
     at java.util.regex.Matcher.reset(Matcher.java:309) 
     at java.util.regex.Matcher.<init>(Matcher.java:229) 
     at java.util.regex.Pattern.matcher(Pattern.java:1093) 
     at org.lwjgl.system.APIUtil.apiParseVersion(APIUtil.java:140) 
     at org.lwjgl.system.APIUtil.apiParseVersion(APIUtil.java:122) 
     at org.lwjgl.opengl.GL.createCapabilities(GL.java:278) 
     at org.lwjgl.opengl.GL.createCapabilities(GL.java:226) 
     at com.advancid.minage.gui.Window.makeCurrentContext(Window.java:85) 
     at com.advancid.minage.gui.Window.<init>(Window.java:19) 
     at com.advancid.minage.gui.WindowTest.workForOneWindow(WindowTest.java:9) 

Вот мой класс испытаний единицы измерения.

package com.advancid.minage.gui; 

import org.junit.Test; 

public class WindowTest { 

    @Test 
    public void workForOneWindow() { 
     Window window = new Window("My window", 1280, 720); 
     window.show(); 
     window.makeCurrentContext(); 
     window.update(); 
     window.destroy(); 
    } 

} 

И вот мой класс окон.

package com.advancid.minage.gui; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.glfw.GLFW; 
import org.lwjgl.opengl.GL; 
import org.lwjgl.opengl.GLCapabilities; 
import org.lwjgl.system.MemoryUtil; 

import java.nio.IntBuffer; 

public class Window { 

    private long handle; 
    private GLCapabilities capabilities = null; 

    public Window(String title, int width, int height) { 
     GLFW.glfwDefaultWindowHints(); 
     this.handle = GLFW.glfwCreateWindow(width, height, title, MemoryUtil.NULL, MemoryUtil.NULL); 
     this.makeCurrentContext(); 
    } 

    public void show() { 
     GLFW.glfwShowWindow(this.handle); 
    } 

    public void hide() { 
     GLFW.glfwHideWindow(this.handle); 
    } 

    public boolean shouldClose() { 
     return GLFW.glfwWindowShouldClose(this.handle) == GLFW.GLFW_TRUE; 
    } 

    public void resize(int width, int height) { 
     GLFW.glfwSetWindowSize(this.handle, width, height); 
    } 

    public int[] getSize() { 
     IntBuffer widthBuffer = BufferUtils.createIntBuffer(1); 
     IntBuffer heightBuffer = BufferUtils.createIntBuffer(1); 

     GLFW.glfwGetWindowSize(this.handle, widthBuffer, heightBuffer); 

     return new int[] { widthBuffer.get(), heightBuffer.get() }; 
    } 

    public int getWidth() { 
     return getSize()[0]; 
    } 

    public int getHeight() { 
     return getSize()[1]; 
    } 

    public void setPosition(int x, int y) { 
     GLFW.glfwSetWindowPos(this.handle, x, y); 
    } 

    public int[] getPosition() { 
     IntBuffer xBuffer = BufferUtils.createIntBuffer(1); 
     IntBuffer yBuffer = BufferUtils.createIntBuffer(1); 

     GLFW.glfwGetWindowPos(this.handle, xBuffer, yBuffer); 

     return new int[] { xBuffer.get(), yBuffer.get() }; 
    } 

    public int getX() { 
     return getPosition()[0]; 
    } 

    public int getY() { 
     return getPosition()[1]; 
    } 

    public void destroy() { 
     GLFW.glfwDestroyWindow(this.handle); 
    } 

    public void makeCurrentContext() { 
     GLFW.glfwMakeContextCurrent(this.handle); 
     GLFW.glfwSwapInterval(1); 

     if (this.capabilities == null) { 
      this.capabilities = GL.createCapabilities(); 
     } else { 
      GL.setCapabilities(this.capabilities); 
     } 
    } 

    public void update() { 
     GLFW.glfwSwapBuffers(this.handle); 
     GLFW.glfwPollEvents(); 
    } 

} 
+0

Можете ли вы добавить Stack trace of exception? – PVR

+0

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Tom

+3

@Tom Это не дубликат этого вопроса, так как это библиотека сторонних разработчиков, которая генерирует это исключение, и я знаю, что такое NullPointerException. –

ответ

1

У меня была эта ошибка, потому что я забыл инициализировать GLFW. Очень странно, потому что я назвал некоторые функции GLFW до того, как он сработал.

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