[英]Why does NumberFormat.format throw an NullPointerException?
我剛發現一個非常奇怪的NullPointerException
。 首先,我創建一個這樣的NumberFormat
(注意默認的Locale
是德國,我不知道是否有幫助):
NumberFormat angleFormat = NumberFormat.getNumberInstance(Locale.UK);
angleFormat.setMaximumFractionDigits(5);
angleFormat.setMinimumFractionDigits(0);
然后,我試着用它格式化一個雙。 這是通過Lambda創建的新線程完成的,而angleFormat
是在包含Lambda的方法中聲明的。 拋出異常的代碼如下所示:
con.println("D" + moveId + (state.isEnemyInSightOf(e) ? "+" : "-")
+ angleFormat.format(e.getAngle()) // line 123 - error is here
+ (state.isMissileInSightOf(e) ? "+" : "-")
+ angleFormat.format(e.getSight())
+ (e.getLastShot() >= 10 || e.getLastShot() <= -1 ? "+" : "-")
+ angleFormat.format(e.getLives()));
e.getAngle()
返回一個double
,因此它不能返回null。 但是,我得到了這個例外:
Exception in thread "Thread-1" java.lang.NullPointerException
at java.text.DecimalFormat.fastDoubleFormat(Unknown Source)
at java.text.DecimalFormat.fastFormat(Unknown Source)
at java.text.NumberFormat.format(Unknown Source)
at server.game.Simulator.lambda$0(Simulator.java:123)
at server.game.Simulator$$Lambda$3/23162747.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我確定e
不是null因為Exception的堆棧跟蹤,它會a)先拋出一行而b)不拋出java.text.DecimalFormat.fastDoubleFormat
為什么有時會拋出NullPointerException
,有時它可以正常工作? 這意味着什么? 該錯誤似乎是可重現的,但不是很常見。
從評論中:我在一個循環中創建線程,每個線程都有不同的
e
但是相同的NumberFormat
這似乎是您的代碼遇到的間歇性問題的根源。 根據NumberFormat
的文檔 ,該類不是線程安全的,因此必須在外部同步並發訪問:
數字格式通常不同步。 建議為每個線程創建單獨的格式實例。 如果多個線程同時訪問格式,則必須在外部進行同步。
來自JavaDoc for DecimalFormat
同步
十進制格式通常不同步。 建議為每個線程創建單獨的格式實例。 如果多個線程同時訪問格式,則必須在外部進行同步。
順便問一下,這個版本的Java是什么? 我沒有在Java 6或7的文檔中看到DecimalFormat.fastFormat()
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.