![](/img/trans.png)
[英]Strange java.lang.ArrayIndexOutOfBoundsException: -1
[英]Strange ArrayIndexOutOfBoundsException for Java SimpleDateFormat
我們運行Java 1.4。
我們有這個方法:
static SimpleDateFormat xmlFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
public static Date fromXml(String xmlDateTime) {
ParsePosition pp = new ParsePosition(0);
return xmlFormatter.parse(xmlDateTime, pp);
}
例如, xmlDateTime = 2013-08-22T16:03:00
。 這一直有效,但突然停止了!
我們現在得到這個例外:
java.lang.ArrayIndexOutOfBoundsException: -1
at java.text.DigitList.fitsIntoLong(DigitList.java:170)
at java.text.DecimalFormat.parse(DecimalFormat.java:1064)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1381)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1159)
我試圖通過使用不同的日期格式在單元測試中重現這一點,即:
2013-08-22T16:03:00
2013-08-22 16:03:00
但沒有運氣! 有任何想法嗎?
一個鮮為人知的事實是SimpleDateFormat
不是線程安全的 !
它不是一個錯誤: javadoc記錄了這種行為:
日期格式未同步。 建議為每個線程創建單獨的格式實例。 如果多個線程同時訪問格式,則必須在外部進行同步。
每次需要時創建一個實例,或者如果性能是一個真正的問題,您可以嘗試使用ThreadLocal
為每個需要一個的線程存儲一個實例。
不要感覺不好:我完全傾向於“優化”(重用一個常量實例),令我驚訝的是,每次都必須實例化一個新實例。
看起來像這個錯誤報告 。 根本原因被診斷為DecimalFormat
根本不是線程安全的。
所以你不應該在不同的線程上使用相同的SimpleDateFormat
實例,因為它和DecimalFormat
仍然不是線程安全的。
您可以使用ThreadLocal
讓每個線程使用自己的實例。
每次創建實例的簡單方法,本地/范圍變量而不是全局變量,它適用於我
private void test {
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(pattern, Locale.ENGLISH);
// Do somethings
}
嘗試使用Commons Lang 3.x FastDateParser和FastDateFormat。 這些類是線程安全的,比SimpleDateFormat更快。 它們還支持與SimpleDateFormat相同的格式/解析模式規范。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.