gpt4 book ai didi

java - JAR 导出后无法加载文本文件

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:47 25 4
gpt4 key购买 nike

我一直在使用 Java、OpenGL/LWJGL 和 Slick-Utils 开发 3D 游戏引擎,但我无法克服程序中的这个错误(空指针异常)。

错误:

 Exception in thread "main" java.lang.ExceptionInInitializerError
at engineTester.Main.main(Main.java:22)
Caused by: java.lang.NullPointerException
at com.hybridia.engine3D.shaders.StaticShader.<clinit>(StaticShader.java:13)
... 1 more

engineTester.Main.main的第22行是StaticShader初始化的地方。

代码源自的文件(错误行旁边有注释):

    package com.hybridia.engine3D.shaders;
import java.net.URL;

import org.lwjgl.util.vector.Matrix4f;

public class StaticShader extends ShaderProgram {

private int location_transformationLocaiton;

private static final String VERTEX_FILE = URL.class.getClass().getClassLoader()
.getResource("/resc/shaders/vertexShader.txt").toString(); //Error Here
private static final String FRAGMENT_FILE = URL.class.getClass().getClassLoader()
.getResource("/resc/shaders/fragmentShader.txt").toString();

public StaticShader() {
super(VERTEX_FILE, FRAGMENT_FILE);
}

@Override
protected void bindAttributes() {
super.bindAttribute(0, "position");
super.bindAttribute(1, "textureCoords");
}

@Override
protected void getAllUniformLocations() {
location_transformationLocaiton = super.getUniformLocation("transformationMatrix");

}

public void loadTransformation(Matrix4f matrix) {
super.loadMatrix(location_transformationLocaiton, matrix);
}

}

(下一行 (FRAGMENT_FILE) 也有错误,但修复第一行将修复第二行。)

我正在尝试做什么:

我将此项目导出为 JAR,以便可用于我 future 的 3D 项目。但是,当我在测试项目中运行它时,出现上述错误。我尝试了多种方法(如下所示),但要么出现空指针异常,要么出现找不到文件异常StaticShader 类继承自 ShaderProgam 类,该类采用 VERTEX_FILEFRAGMENT_FILE 并使用 GLSL 代码对 VAO 和 VBO 执行操作。

我知道问题出在第 13 行(带有 //Error Here 注释的行)。由于某种原因,我尝试做的任何事情都失败了。我知道这些文件 100% 存在,因为在测试项目的引用库中我看到“vertexShader.txt”和“fragmentShader.txt”。我(毫不夸张地)将这两个文件放在程序中的任何位置,希望它能够被 StaticShader/ShaderProgram 读取。我为这两个文本文件创建了一个文件夹,该文件夹是构建路径的一部分。

我会发布一个层次结构的图像,这样它看起来很漂亮并且更容易理解,但我没有这样做的声誉。这是没有图片的层次结构的最佳表示:

SpaghettiEngineMKIII
|
|
|
|com.hybridia.engine3D.shaders
| |ShaderProgram
| |StaticShader
|
|
|resc
|shaders
|vertexShader.txt
|fragmentShader.txt

我尝试解决此问题的方法:(只是我尝试自行修复错误的一点证明)

  • 输入流
  • InputStream 和 BufferedReader
  • 网址
  • 输入流和 URL
  • 通过 super 传递字符串而不使用 URL/InputStream

重复/TL;DR:

我已导出该项目并将其制作为 JAR 文件。我已将所述 JAR 添加到测试项目的构建路径中以测试渲染限制。然而,尽管不断修改 StaticShader 类中的搜索代码,但在启动测试项目时仍无法找到/访问着色器文件。这可能是路径错误/不是相对或绝对的问题,还是我必须以不同的方式从我所做的事情中获取文本文件?

简单的历史记录:当 StaticShader 位于测试项目而不是游戏引擎项目中时,该项目运行良好。我移动它是因为当我继续编码时,我需要在引擎本身的其他类中引用 StaticShader。

如果有什么事情表现得“活泼”,我很抱歉,我不希望这种情况发生。

编辑:

ShaderProgram 实际上读取文件,StaticShader 查找文件并完成创建 VBO 的所有有趣的工作。我忘了之前提到过。

最佳答案

NPE 似乎来自资源。 URL 的类加载器似乎与包含 jar 文件的类加载器不同。您是否尝试将错误行更改为这样?:

private static final String VERTEX_FILE = StaticShader.class.getClass().getClassLoader()
.getResource("/resc/shaders/vertexShader.txt").toString();

StaticShader.class 包含在与 txt 文件相同的 jar 文件中,因此我希望它能够工作...

关于java - JAR 导出后无法加载文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com