java - if-else 条件 : AND evaluation mystery

标签 java android if-statement

我正在开发一款适用于 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 对于 || ),右侧操作数不需要求值:表达式的值是已知的。

!createdcreated == false如果 created 在 Java 中是相同的是boolean .如果是 Boolean ,你会遇到自动装箱/拆箱的问题:

  • !created自动拆箱 Booleanboolean并用 ! 补充结果.

  • created == false汽车箱 false boolean 文字到 Boolean并比较对象引用。它们不一定相同 Boolean对象。

为避免此类问题,根据经验,不要使用 truefalse直接在 boolean 表达式中。

关于java - if-else 条件 : AND evaluation mystery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677767/

相关文章:

python - 如何使用空值在 pandas/python 中执行条件语句

java - Spring Boot 总是显示 @Value 注解的值为 null

java - 通知无需遵循 AlarmManager 即可工作

java - 如何调整 JavaFX 3D 子场景的大小?

android - 我可以在使用 gradle 时从 AndroidManifest 中删除 com.google.android.gms.version 吗?

javascript - 如何定义 jquery/javascript 状态?

java - 如何创建复杂查询的请求? @Query jpql spring jpa

Android平台游戏关卡编辑器

android - 如何从 PhoneGap/Cordova 应用程序直接导航到 Google Play 商店中的应用程序?

python - 如何在numpy中实现多个ifelse