-1

Недавно я работал над калькулятором, используя java и javafx. Я создавал условия для своих событий, но я получаю исключение NullPointerException. Теперь вот значения:NullPointerException внутри оператора if

Boolean eventTest; 
String stringX, stringY; 

stringX уже будет определен, когда я запустил это.

После использования отладчика сводилось к этой строке кода:

if(eventTest == false & stringY == null & stringX != null||eventTest == false & stringY != null & stringX != null) 

Вот трассировки стека:

java.lang.NullPointerException 
at calculator$3.handle(calculator.java:263) 
at calculator$3.handle(calculator.java:1) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
at javafx.event.Event.fireEvent(Unknown Source) 
at javafx.scene.Node.fireEvent(Unknown Source) 
at javafx.scene.control.Button.fire(Unknown Source) 
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
at javafx.event.Event.fireEvent(Unknown Source) 
at javafx.scene.Scene$MouseHandler.process(Unknown Source) 
at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source) 
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source) 
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source) 
at com.sun.glass.ui.View.notifyMouse(Unknown Source) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$141(Unknown Source) 
at com.sun.glass.ui.win.WinApplication$$Lambda$37/1109371569.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Вопрос в Почему я получаю NullPointerException от этой линии кода и как его исправить?

Спасибо.

+0

ли вы имели в виду, чтобы выполнить побитовое '' & операции или вы имеете в виду '' && (и) вместо этого? – MadProgrammer

+2

@MadProgrammer Односимвольные операторы на булевых элементах не побиты. Они просто не замыкаются. – chrylis

+1

Немного одного голоса, чтобы закрыть причину разумной причины ... Я думаю, если вы не поймете вопрос, лучше оставить комментарий или держаться подальше от этого. –

ответ

4

Ваш Boolean, с капиталом, является классом-оболочкой, а значение по умолчанию переменной равно null. Вам, вероятно, просто нужен примитив boolean. Если есть определенная причина, вам понадобится оболочка, инициализируйте ее.

3

Проверьте, есть ли eventTestnull. Так как Boolean позволяет принимать значения null.

1

Здесь

eventTest == false // default value of a Java object is null 

eventTest является Boolean типа объекта и его значение по умолчанию null.

Так eventTest является null и не распаковывать null в boolean, так что вы получите NullPointerException.

Java Language Specification может помочь вам понять, что здесь происходит.

Вот от типа Boolean к типу boolean распаковка произойдет, как если г является ссылкой типа Boolean, а затем распаковка преобразования преобразует r в r.booleanValue()

Когда r является null. вы получите NullPointerException.

2

Эта строка кода пугает меня:

if(eventTest == false 
    & stringY == null & stringX != null || 
    eventTest == false & stringY != null & stringX != null) 

Вы даже поняли, что в обоих состоянии || вы делаете то же проверки?

В любом случае, это не главное.

eventTest является В oolean, так что это объект, который означает, что он является недействительным, если не инициализируются так что он может бросить NPE, если не подтверждено перед проверкой ложного/истинного значения.

0

eventTest == false приведет к возникновению события unboxing события EventTest, и если он равен нулю, вы получите Исключение NullPointer.

0

Если вы используете для сравнения значение объекта, лучше использовать метод равных, чем с использованием ==. Следующий код может преодолеть проблему:

if((eventTest != null && eventTest == false) & stringY == null & stringX != null || (eventTest != null && eventTest == false) & stringY != null & stringX != null) 

eventTest == false в конце концов, можно записать в виде bol.equals(false) или bol.booleanValue() == false после проверки нулевой eventTest != null.

Если вы не уверены, с указанным кодом объявить eventTest в качестве примитивного булевы:
boolean eventTest;

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