Calling System.exit(0) in GLProgram.destroy() is bad design. Utils.checkGLError(String) now throws an OpenGLException instead of RuntimeException, as that is much more appropriate.