使用getSystemResource(..)的NullPointerException

时间:2017-12-04 20:52:46

标签: java textures lwjgl

我尝试用Java构建LWJGL 3的纹理类。

我的loadTexture函数如下所示:

   public static Texture loadTexture(String filename) {
        int id = -1;

        try {
            File texture = new File(filename);

            if (!texture.exists()) {
                System.err.println("File '" + filename + "' does not exist.");
                return null;
            }

            // crash in following line
            InputStream stream = ClassLoader.getSystemResource(filename).openStream(); 
            PNGDecoder decoder = new PNGDecoder(stream);

            // Some code between here

            return new Texture(id, new Vector2i(decoder.getWidth(), decoder.getHeight()));
        } catch (IOException e) {
            e.printStackTrace();
            return new Texture(id, new Vector2i());
        }
    }

堆栈跟踪如下:

Exception in thread "main" java.lang.NullPointerException
    at org.citynopolisproject.graphics.Texture.loadTexture(Texture.java:49)
    at org.citynopolisproject.Game.<init>(Game.java:30)
    at org.citynopolisproject.Game.<init>(Game.java:33)
    at org.citynopolisproject.Game.main(Game.java:188)

文件的位置是:citynopolisproject / res / splash.png,而Texture.java的源文件(如果需要)存储在citynopolisproject / src / org / citynopolisproject / graphics中。

但我不明白为什么它崩溃并抛出NPE。 你有什么想法吗?

问候

1 个答案:

答案 0 :(得分:0)

问题(我怀疑)是ClassLoader.getSystemResource(filename)返回null。这可能是因为您要查找的文件不在类路径中,或者因为类加载器无法通过您引用它的名称找到该资源。

为了帮助我们了解项目结构的更多信息。您要查找的文件在哪里,是否在Jar文件中运行?

您可能需要查找有关如何在类路径上引用资源的更多信息。请记住,一旦你构建了jar,你通常无法用new File(filename)引用它。

修改

您很可能不想绕过从该类路径获取资源。如果你打算对这个程序进行jar操作,那么你应该使用一些即使在它被震动之后也能工作的东西。