0
public class Log {

    private static StringBuilder log = new StringBuilder();

    private static StringBuilder getLog() {

        return log;

    }


    public static void addToLog(String id, String name, String field, String operator, String value, String bValue) {

        Calendar calendar = Calendar.getInstance();
        String currentTime = formatter.format(calendar.getTime());
        getLog().append(currentTime); // line 114

    }

}

スタックトレース:

[java] Exception in thread "Thread-5" java.lang.ArrayIndexOutOfBoundsException 
[java]     at java.lang.String.getChars(String.java:863) 
[java]     at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416) 
[java]     at java.lang.StringBuilder.append(StringBuilder.java:132) 
[java]     at com.retroficiency.system.Log.addToMatchingLog(Log.java:114)

この方法は通常は正常に機能しますが、このランダムエラーが発生したため、理由がわかりません。ログをファイルにフラッシュし、次のコマンドでクリアする別の方法があります。

getLog().delete(0, getMatchingLog().length());

Javaのバグだとは思いませんか?長くなりすぎていませんか?助けてくれてありがとう!

4

2 に答える 2

10

StringBuilder はスレッドセーフではありません。この場合、StringBuffer を使用する必要があります。

この他の SO スレッドで詳細を確認できます。

StringBuilder と StringBuffer の違い

于 2012-10-11T17:55:37.800 に答える
3

別のスレッドからこのメソッドにアクセスしない限り、これが発生する理由はありStringBuilderません。スレッドセーフではありません。スレッドセーフな を使用するStringBufferか、何らかの形式の同期を追加できます。

Javadoc :

StringBuilder のインスタンスは、複数のスレッドで安全に使用できません。このような同期が必要な場合は、StringBuffer を使用することをお勧めします。

于 2012-10-11T17:56:04.717 に答える