我正在开发一个使用JavaFx在列表中显示图标的程序。 我创建了一个静态类,用于从txt文档中查找特定的id。最初,静态块会添加每行定义的项目的ID和名称,但由于出现了这些问题,我试图找到问题的根源。
相反,我刚刚浏览了静态块中的文本文件内容并将其打印到控制台。
这是我的参考代码:
public class ItemIds {
public static int UNDEFINED_ID = -1;
private static HashMap<String, Integer> items;
static {
items = new HashMap<String, Integer>();
System.out.println(new File("res/ids/item ids.txt").exists());
try {
//should print out every line in the text file
Files.lines(Paths.get("res/ids/item ids.txt")).forEach(s -> {
System.out.println(s);
});
} catch (IOException e) {
System.out.println("Unable to read specified file.");
e.printStackTrace();
}
}
public static int getId(final String name) {
final Integer id = items.get(name);
return id != null ? id : UNDEFINED_ID;
}
}
但是,当初始化此静态类并调用静态块时,我所得到的是非常奇怪的。它列出每一行都没有错误,直到它到达第10691行,在那里它抛出“线程中的异常”JavaFX应用程序线程“java.lang.ExceptionInInitializerError”。
然而,这使得特别奇怪的是,当我使用较小的文本文档(条目较少)时,一切似乎都能正常工作。由于该文件由近14000行组成,因此我必须删除约4000行才能使其工作。
有关为何会这样做的任何想法?感谢任何反馈 - 谢谢
答案 0 :(得分:0)
我无法重现此错误。我创建了一个18K行的文件,你编程就可以了。因此,请务必考虑查看您的文件以及堆栈跟踪。
现在回到您的异常 ExceptionInInitializerError ,以下是可能的:
ExceptionInInitializerError表示静态初始值设定项中发生了意外异常。抛出ExceptionInInitializerError以指示在评估静态初始化程序或静态变量的初始化程序期间发生异常。
class ItemIds
{
static
{
// if something does wrong -> ExceptionInInitializerError
}
}
因为静态变量是在静态块中初始化的,所以也有可能引入错误。一个例子:
class ItemIds
{
static int v = D.foo();
}
=&GT;
class ItemIds
{
static int v;
static
{
v = D.foo();
}
}
因此,如果foo()变得疯狂,那么你可以获得ExceptionInInitializerError。
您是否在静态阻止中提供了完整的代码?