2014-10-22 15 views
5

Ich habe gerade eine sehr seltsame NullPointerException gefunden. Zuerst erstelle ich ein NumberFormat wie folgt aus (beachten Sie, dass die Standard-Locale Deutschland wäre, ich weiß nicht, ob das hilft):Warum wirft NumberFormat.format eine NullPointerException?

NumberFormat angleFormat = NumberFormat.getNumberInstance(Locale.UK); 
angleFormat.setMaximumFractionDigits(5); 
angleFormat.setMinimumFractionDigits(0); 

Dann habe ich versucht, ein Doppel damit zu formatieren. Dies geschieht mit einem neuen Thread, der von einem Lambda erstellt wird, während angleFormat bei der Methode deklariert wird, die das Lambda enthält. Der Code, wo die Ausnahme wird wie folgt geworfen aussieht:

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() gibt ein double, so dass es nicht null zurückkehren kann. Allerdings habe ich diese Ausnahme erhalten:

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) 

Ich bin sicher, dass e wegen der Ausnahme der Stacktrace nicht null ist, wäre es a) werden eine Zeile früher geworfen und b) nicht java.text.DecimalFormat.fastDoubleFormat

Warum wird NullPointerException geworfen manchmal, und manchmal funktioniert es ohne Probleme? Und was bedeutet das? Der Fehler scheint reproduzierbar zu sein, aber nicht sehr oft.

+0

was ist er Linie 123? –

+4

'" NullPointerException manchmal geworfen, und manchmal funktioniert es ohne Probleme? Und was bedeutet das? "' - dieser intermittierende Fehler riecht nach einem Threading-Problem. Ist das eine GUI? Bist du vorsichtig mit dem Threading deines Codes? –

+1

Sind Sie sicher, dass "e" selbst nicht "null" ist? – Mureinik

Antwort

4

Aus den Kommentaren: Ich schaff' die Fäden in einer Schleife mit jedem einer anderen e aber den gleichen NumberFormat

Dies ist die Quelle der intermittierenden Probleme zu sein scheint, dass Ihr Code auftritt. Gemäß der documentation of NumberFormat ist die Klasse nicht threadsicher, so dass der gleichzeitige Zugriff extern synchronisiert werden muss:

Zahlenformate sind im Allgemeinen nicht synchronisiert. Es wird empfohlen, separate Format-Instanzen für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden.

1

Von der JavaDoc DecimalFormat für

Synchronisation

Dezimalformate synchronisiert sind im Allgemeinen nicht. Es wird empfohlen, separate Format-Instanzen für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden.

Übrigens, welche Version von Java ist das? Ich sehe keine DecimalFormat.fastFormat() Methode in den Dokumenten für entweder Java 6 oder 7.

+0

Da ich in der Frage erwähnt habe, dass ich Lambdas verwende, verwende ich Java8 – msrd0

Verwandte Themen