LWJGL 3.1.1 has a new implementation for calling OpenGL and OpenGL ES functions. This implementation stores context function pointers in internal JVM state, which is readily available when making a JNI method call. The benefit is that it completely eliminates thread-local lookups when calling GL/GLES functions.
One major trade-off is that function pointers are not checked anymore before LWJGL calls them (like always running with -Dorg.lwjgl.util.NoChecks=true). This means that if you call a function not exposed by the GL/GLES context, or if you call a function in a thread with no context current, you will get a crash.
It looks like the later is what's happening in your case. Judging by the stacktrace, you're calling glGetUniformLocation in a finalizer. Finalizers run in the "Finalizer" thread, which doesn't have an OpenGL context current. You would get an exception before LWJGL 3.1.1, but now you get a crash instead.