2014-10-22 4 views
5

Я только что нашел очень странный NullPointerException. Во-первых, я создаю NumberFormat как это (обратите внимание, что по умолчанию Locale будет Германия, я не знаю, если это помогает):Почему NumberFormat.format выбрасывает исключение NullPointerException?

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, поэтому он не может возвращать нуль. Тем не менее, я получаю это исключение:

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 не равно нулю из-за StackTrace за исключением, было бы а) быть выброшены одна линия раньше и б) не java.text.DecimalFormat.fastDoubleFormat

Почему есть NullPointerException beeing thrown иногда, а иногда он работает без проблем? И что это значит? Ошибка, кажется, воспроизводима, но не очень часто.

+0

что это за строка 123? –

+4

'' Исключение NullPointerException иногда, а иногда это работает без проблем? И что это значит? "' - эта прерывистая ошибка пахнет проблемой потоковой передачи. Это графический интерфейс? Вы внимательно относитесь к потоку вашего кода? –

+1

Вы уверены, что 'e' не является' null'? – Mureinik

ответ

4

Из комментариев: Я создаю нити в петле с каждой из них разные e, но тот же NumberFormat

Это, как представляется, является источником прерывистого вопросов, что ваш код испытывает. Согласно documentation of NumberFormat, класс не является потокобезопасным, поэтому параллельный доступ должен быть синхронизирован извне:

Форматы чисел обычно не синхронизированы. Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков обращаются к формату одновременно, его необходимо синхронизировать извне.

1

Из JavaDoc для DecimalFormat

Синхронизация

десятичные форматы, как правило, не синхронизированы. Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков обращаются к формату одновременно, его необходимо синхронизировать извне.

Кстати, какая версия Java это? Я не вижу метода DecimalFormat.fastFormat() в документах для Java 6 или 7.

+0

Поскольку я упоминал в вопросе, что я использую Lambdas, я использую Java8 – msrd0

Смежные вопросы