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线程安全的 a 或添加某种形式的同步。

爪哇文档

StringBuilder 的实例对于多线程使用是不安全的。如果需要这种同步,则建议使用 StringBuffer。

于 2012-10-11T17:56:04.717 回答