我正在开发一款适用于 Android 的应用程序。在我的代码中有以下几行:
if (shape != null && !created && isTap(touchDown, event)) {
DrawPrimitive newShape = listener.onTouch(event, shape);
if (newShape != shape)
canvas.onDrawingChanged(true);
}
created 是一个 boolean 值成员。我想知道,因为 created 是真的,但即使不调用 isTap 方法,运行时也会进入我的 if 。如果我改变!对于错误的比较,一切正常。
if (shape != null && created == false && isTap(touchDown, event)) {
DrawPrimitive newShape = listener.onTouch(event, shape);
if (newShape != shape)
canvas.onDrawingChanged(true);
}
所以我想知道 !不允许。但即使是这样,为什么我的 isTap 方法(在版本一中)没有被调用,为什么内部代码在不评估所有 AND 条件的情况下执行。
最佳答案
为什么 isTap()
不叫:&&
连词(以及 ||
与此相关的析取)通过从左到右的短路求值:当表达式的左侧操作数求值为 false
时( true
对于 ||
),右侧操作数不需要求值:表达式的值是已知的。
!created
和 created == false
如果 created
在 Java 中是相同的是boolean
.如果是 Boolean
,你会遇到自动装箱/拆箱的问题:
!created
自动拆箱Boolean
至boolean
并用!
补充结果.created == false
汽车箱false
boolean 文字到Boolean
并比较对象引用。它们不一定相同Boolean
对象。
为避免此类问题,根据经验,不要使用 true
或 false
直接在 boolean 表达式中。
关于java - if-else 条件 : AND evaluation mystery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677767/