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()行でスローされますが、実行を継続すると、もう一方の行でもスローされることが想像できます。

それはある種のスレッドの問題である可能性がありますか、それとも原因は別の場所にある可能性がありますか?

グーグルは私に(年齢で初めて)使用可能な結果を​​与えませんでした。とにかく、セットが負のサイズになるにはどうすればよいですか?

編集:例外:

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()、マルチスレッド環境で直接またはまたはを介して返されたセットを介して機能するには、明示的なロックが必要entrySet()です。

これを怠ると、内部状態に一貫性がないため、多くの興味深い副作用が発生する可能性があります。HashMapデバッガーを使用してその例外を解除し、何が起こっているのかをよく調べることをお勧めします。

于 2012-12-31T18:34:03.393 に答える