簡體   English   中英

Java SimpleDateFormat的奇怪ArrayIndexOutOfBoundsException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM