Java if语句中的NullPointerException

Java if语句中的NullPointerException,java,if-statement,nullpointerexception,javafx,runtime-error,Java,If Statement,Nullpointerexception,Javafx,Runtime Error,最近我一直在使用java和javafx开发一个计算器。我一直在为我的事件设置条件,但我得到了一个NullPointerException。下面是这些值: Boolean eventTest; String stringX, stringY; 运行此命令时,stringX已被定义 使用调试器后,问题归结为以下代码行: if(eventTest == false & stringY == null & stringX != null||eventTest == false &

最近我一直在使用java和javafx开发一个计算器。我一直在为我的事件设置条件,但我得到了一个NullPointerException。下面是这些值:

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,以及如何修复它

谢谢。

检查eventTest是否为空。因为布尔值允许空值。

您的布尔值(大写)是一个包装类,变量的默认值为空。您可能只需要一个基本布尔值。如果有特殊原因需要包装器,请初始化它

这里

 eventTest == false // default value of a Java object is null
eventTest是布尔对象类型,其默认值为null

所以eventTest为null,并且无法将null取消装箱为boolean,所以您将得到NullPointerException

也许能帮助你了解这里发生了什么

在这里,从布尔类型到布尔类型的取消装箱就像r是布尔类型的引用一样发生,然后取消装箱转换将r转换为r.booleanValue


当r为null时。您将获得NullPointerException。

这行代码让我害怕:

if(eventTest == false 
  & stringY == null & stringX != null ||
  eventTest == false & stringY != null & stringX != null)
你们有并没有意识到在这两种情况下,你们做的验证是一样的

无论如何,这不是重点


eventTest是一个布尔值,因此它是一个对象,这意味着如果未初始化它就为null,因此在检查false/true值之前如果未验证它就可以抛出NPE。

eventTest==false将导致eventTest的失败,如果它为null,则
获取空指针异常。

如果您使用对象的值进行比较,则使用equals方法比使用==。以下代码可以解决您的问题:

if((eventTest != null && eventTest == false) & stringY == null & stringX != null || (eventTest != null && eventTest == false) & stringY != null & stringX != null)
在检查空eventTest之后,eventTest==false最终可以写入bol.equalsfalse或bol.booleanValue==false!=空

如果您对上述代码不满意,请将eventTest声明为原始布尔值:
布尔事件检验

您的意思是执行按位&运算,还是改为&&and?@MadProgrammer布尔型上的单字符运算符不是按位的。他们只是不短路。有人投了一票就结束了,给理由一个有趣的理由。。。我认为如果你不理解这个问题,最好留下评论或远离它。是的,这绝对是一个明确的问题。微妙的问题,但需要的一切都在那里。