4

由于某种原因,我的程序NegativeArraySizeException在运行一段时间后突然抛出一个。抛出它的代码在我在抛出异常之前输入的命令后面。

我使用的代码主要用于调试目的,如下所示:

final HashMap<String, Integer> busy = new HashMap<>();
//this map gets filled and emptied in threads

System.out.println("Busy tables: " + Arrays.toString(this.busy.keySet().toArray()));
System.out.println("Time busy: " + Arrays.toString(this.busy.values().toArray()));
//map gets read (from the input handler thread)

异常会在第一System.out.println()行抛出,但我可以想象如果它继续运行,它也会被抛出到另一行。

可能是某种线程问题还是原因可能在其他地方?

谷歌(多年来第一次)没有给我任何可用的结果。Set 怎么会有一个负大小呢?

编辑:例外:

Exception in thread "Thread-1" java.lang.NegativeArraySizeException
    at java.util.AbstractCollection.toArray(Unknown Source)
    at nl.lolmewn.statsglobal.Main.handleInput(Main.java:61)
    at nl.lolmewn.statsglobal.Main.access$000(Main.java:20)
    at nl.lolmewn.statsglobal.Main$1.run(Main.java:200)
    at java.lang.Thread.run(Unknown Source)
4

1 回答 1

8

如果没有有关您的代码的更多信息,我会认为对HashMap对象的不受保护的多线程访问是主要嫌疑人。HashMap,相反Hashtable同步,需要显式锁才能在多线程环境中工作,直接或通过通过keySet()or返回的集合entrySet()

由于处于不一致的内部状态,否则会产生许多有趣的副作用。HashMap我建议使用调试器来中断该异常并更好地了解正在发生的事情。

于 2012-12-31T18:34:03.393 回答