gpt4 book ai didi

scala - 在什么情况下非空 future f 可以在 'f.onComplete(x => println("hello"))' 上抛出 NullPointerException?

转载 作者:行者123 更新时间:2023-12-04 04:41:36 25 4
gpt4 key购买 nike

我对从以下代码片段中得到的 NPE 感到困惑:

import sys.process._
val context = ExecutionContext.Implicits.global
val fr = Future {
Seq("sudo", "sh", "-c", cmd).! // some command line command
}(context)
try {
if (fr == null) {
println("was null")
} else {
println("was not null")
}
fr.onComplete(t => println("hello"))
} catch {
case e: Throwable => println(s"caught: $e")
}

输出:

was not null
caught: java.lang.NullPointerException

编辑:我明白为什么现在有 NPE。我需要为 onComplete 隐式或显式提供执行上下文。我不明白的是为什么这段代码按原样编译:

  1. 如果我像 fr.onComplete(t => println("hello"))(context) 那样手动提供上下文,那么代码会按预期工作。
  2. 如果我声明 implicit val context = ExecutionContext.Implicits.global
    然后我得到一个编译错误(找不到 onComplete 的隐式执行上下文)。为什么这不能解决问题?
  3. 如果我更改为 import ExecutionContext.Implicits.global 然后 onComplete 编译,但是 Future { Seq...} 提示缺少执行上下文(当然是在我删除显式传递的执行上下文之后)。

有人能理解这一点吗?

最佳答案

似乎有可能 onComplete 正在选择一个与您想要的不同的隐式 ExecutionContext,并且该隐式上下文为 null。这有同样的效果吗?

import sys.process._
val context = ExecutionContext.Implicits.global
val fr = Future {
Seq("sudo", "sh", "-c", cmd).! // some command line command
}(context)
try {
if (fr == null) {
println("was null")
} else {
println("was not null")
}
fr.onComplete(t => println("hello"))(context)
} catch {
case e: Throwable => println(s"caught: $e")
}

或者这个怎​​么样?

import sys.process._
implicit val context = ExecutionContext.Implicits.global
val fr = Future {
Seq("sudo", "sh", "-c", cmd).! // some command line command
}
try {
if (fr == null) {
println("was null")
} else {
println("was not null")
}
fr.onComplete(t => println("hello"))
} catch {
case e: Throwable => println(s"caught: $e")
}

关于scala - 在什么情况下非空 future f 可以在 'f.onComplete(x => println("hello"))' 上抛出 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com