【问题标题】:Cannot invoke method multiply() on null object groovy无法在空对象 groovy 上调用方法 multiply()
【发布时间】:2021-01-17 06:25:14
【问题描述】:

考虑下面的代码

task circle {
doLast {
    float r = Float.parseFloat(project.properties["radius"])
    println (22/7)*(r ** 2)
}
}
task square {
     doLast {
       float s = Float.parseFloat(project.properties["side"])
       println s*s
     }
}

这给错误Cannot invoke method multiply() on null object

如果我将上面的代码更改如下,那就没问题了

task circle {
doLast {
    float r = Float.parseFloat(project.properties["radius"])
    println 22/7*(r ** 2)
}
}
task square {
     doLast {
       float s = Float.parseFloat(project.properties["side"])
       println s*s
     }
}

可能是什么原因?

【问题讨论】:

  • (println(22/7))*(r ** 2) 是 groovy 看到的。 println 的结果为空。
  • @cfrick 是对的。在表达式println(x)*y 中,首先对println(x) 求值,返回null。然后null * y 给出了那个错误。你必须像这样写你的表达式:println (x*y)。好问题,不过!

标签: gradle groovy build build.gradle


【解决方案1】:

这里的问题是缺少实际 println 的括号,即 将导致执行以下代码(println(22/7))*(r ** 2)println 首先完成,其结果 (void) 变为 null。然后它会抛出您看到的错误。你的“不扔” 示例将解析器推向正确的方向。

groovy 中的括号是“如果明确则可选”,这是相当广泛的 学期。当然,使用新的鹦鹉解析器会变得更好,你 经常会看到这样的事情发生。简单的经验法则:只是 除非您正在处理,否则不要省略调用函数的括号 用一个微不足道的术语。

【讨论】:

  • 可选括号在 groovy 中相当混乱,尤其是对于初学者。所以如果你看到a b,这实际上意味着a(b)。这个呢:a (b) c?好吧,这与我们的案例类似,意味着(a(b))(c) 其中a(b) 被评估为null,就像已经提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多