簡體   English   中英

為什么NumberFormat.format會拋出NullPointerException?

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

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