2012-10-11 117 views
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 

    } 

} 

堆棧跟蹤:StringBuilder的ArrayIndexOutOfBoundsException異常

[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錯誤?它變得太久了嗎?謝謝你的幫助!

回答

3

沒有理由爲什麼會發生這種事,除非你從不同的線程訪問這個方法:StringBuilder不是線程安全的。您可以使用線程安全的StringBuffer或添加某種形式的同步。

Javadoc:的StringBuilder

實例用於多個線程使用是安全的。如果需要這種同步,那麼建議使用StringBuffer。

相關問題