原因

  • 多层嵌套 + return 关键字导致 scalac 无法判断这个 return 关键字的作用域, 随后抛出 scala.runtime.NonLocalReturnControl

解决

  • 因为这个错和 npe 差不多, 反正都看不到堆栈, 没法直接定位位置.
  • 想定位的话, 得结合日志和 return 关键字对代码进行仔细观察, 多验证, 总会找到的…

复现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
object NonLocalReturnControl {
def main(args: Array[String]): Unit = {
try {
val r = Math.random() * 1000
r match {
case r1 if r > 0.5 =>
asyncHandler { r =>
// 正确写法
// 1
// 错误写法
return 1
}
// case r2 => return 433
}
} catch {
case e: Throwable =>
e.printStackTrace()
}
}

def asyncHandler(func: Double => Double): Double = {
try {
func(Math.random())
} catch {
case e: Throwable =>
e.printStackTrace()
throw e
}
}
}