【问题标题】:Comparing LocalTime returns true, even tho debugger evaluates to false比较 LocalTime 返回 true,即使调试器评估为 false
【发布时间】:2022-11-18 20:28:55
【问题描述】:

因此,我目前正在研究一个函数,用于检查给定的 LocalTime 是否在范围内。一切都很好,LocalDateTime 的等价物可以正常工作。

所以,我的代码现在看起来像这样:

    public boolean isInRange(LocalTime time){
        return (time.isAfter(roundedStartTime.toLocalTime())) || time.equals(roundedStartTime.toLocalTime()) &&
            time.isBefore(roundedEndTime.toLocalTime());
    }

它有一些关于我的业务逻辑的细节,但这不是问题的一部分。我还有附带的 junit 测试,用于检查逻辑是否按预期工作。同样,inRange(LocalDateTime time) 函数可以完美运行。

但是使用我的测试,同时我使用LocalDateTime确认,它们失败了,因为它们以某种方式返回 true。我已经开始调试,不敢相信自己的眼睛,这解释了 true && falsecheck:

无论出于何种原因,分别评估这两个语句会显示预期的行为,但将它们组合起来会返回 true。

【问题讨论】:

  • 如果您希望您的条件被评估为(A || B) && C,则需要设置适当的括号。目前它被评估为A || (B && C),因为&& 的优先级高于||。意思是一旦第一个条件为真,一切都为真,甚至因为短路而没有被评估。
  • 哇,我怎么错过了,我太早关闭了括号。谢谢!

标签: java validation debugging localtime


【解决方案1】:

你的功能

    public boolean isInRange(LocalTime time){
        return (time.isAfter(roundedStartTime.toLocalTime())) || time.equals(roundedStartTime.toLocalTime()) &&
            time.isBefore(roundedEndTime.toLocalTime());
    }

正在检查是否

timeroundedStartTime之后

或者

time equals roundedStartTime

timeroundedEndTime之前

查看Java operator precedence table,我们可以得出结论,&& 的优先级为4个, 而 || 的优先级为3个.因此,您的条件是检查(时间等于 roundedStartTime 且在 roundedEndTime 之前)或(时间在 roundedStartTime 之后)。

所以,当你的timeroundedStartTime之后和roundedEndTime之后,也就是晚于整个范围时,条件仍然会被评估为真,因为||的第一个操作数被评估为真。要修复它,您需要用括号括起您的||,这样您的逻辑表达式将计算为

(时间 >= roundedStartTime)和(时间 < roundedEndTime)

使固定:

    public boolean isInRange(LocalTime time){
        return ((time.isAfter(roundedStartTime.toLocalTime())) || time.equals(roundedStartTime.toLocalTime())) &&
            time.isBefore(roundedEndTime.toLocalTime());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多