我有一个简单的java项目,我有一个名为Constants的类 我将所有必需的路径存储在静态变量中,就像这样 例如:
public static final String PLAYFIELD_SMALL_IMAGE_PATH = Constants.class.getClassLoader().getResource("Player_Small.png").getPath();
只要我留在Eclipse中就可以正常工作;)
但是当我将程序导出到JAR文件并启动它时,我得到一个例外:
java.lang.ExceptionInInitializerError
当我第一次打电话给以下时出现:
Constants.PLAYFIELD_SMALL_IMAGE_PATH
如果我第二次开始,我会收到此错误:
java.lang.NoClassDefFound: Could not initalize class Constants
我实际上做错了什么?
编辑1:
我在这里找到了这个:"NoClassDefFoundError: Could not initialize class" error
似乎是完全相同的问题。我应该不使用静态变量吗?
编辑2:
如果我使用静态初始化程序块,则会出现ExceptionInInitializerError 被立即抛出。没有静态初始化程序块我能够 到达我的程序的第一个菜单。
编辑3:
也许是另一个暗示!当我提取我的jar时,所有图形都直接在根文件夹中 我试图使用这样的相对路径:
public static final String PLAYFIELD_SMALL_IMAGE_PATH = "Player_Small.png";
但是,如果我这样做,我的图形不会被加载。
答案 0 :(得分:2)
首先解压你的jar并检查是否所有类都在那里。
你可以做很多事情来解决这个问题,首先我会建议你使用maven并了解它(对于初学者来说检查Maven in 5 minutes),但如果你想留在最小的java项目,你可以试试以下:
Thread.currentThread().getContextClassLoader().getResourceAsStream("File1.jpg");
那应该有帮助
答案 1 :(得分:1)
你的问题正是如此:
public static final String PLAYFIELD_SMALL_IMAGE_PATH = Constants.class.getClassLoader().getResource("Player_Small.png").getPath();
阅读这篇文章:NoClassDefFoundError。本文解释了如何 解决你的问题。
我建议你从Constants课程中取出所有的课程 进入另一个类而不使用静态变量。 并且可能使用URL而不是String-Pathes,因为正如您所提到的那样 你使用图像。图像需要定位URL,因为它们 不在硬盘上。如果您不使用URL,则可能无法打印图像。