异常抛出类型为"Nothing"?

flu*_*y03 3 scala exception throw

如此处所述 - Scala编程的第7章,内置控制结构,7.4使用try表达式进行异常处理:

在Scala中,throw是一个具有结果类型的表达式.

从技术上讲,异常抛出类型Nothing.你可以使用throw作为表达式,即使它实际上永远不会评估任何东西.这一点技术体操可能听起来很奇怪,但在前面的例子中经常有用.if的一个分支计算一个值,而另一个分支抛出异常并计算Nothing.整个if表达式的类型是那个计算某事物的分支的类型.

例子是:

val half =
  if (n % 2 == 0)
    n / 2
  else
    throw new RuntimeException("n must be even")
Run Code Online (Sandbox Code Playgroud)

然后我去Scala尝试:

scala> val n = 1
n: Int = 1

scala> val half = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even")
java.lang.RuntimeException: n must be even
  ... 29 elided

scala> half
<console>:12: error: not found: value half
       half
       ^
Run Code Online (Sandbox Code Playgroud)

据说half没有找到.但是,基于这本书,我认为它应该说它是定义的并且它是带有类型的Nothing.

这有什么不对?

Yuv*_*kov 6

据说没有找到一半.但是,基于这本书,我认为它应该说它是定义的,它的类型为Nothing.

如果您重新阅读该段落,您将看到halfNothing应该是的类型,它应该是Int:

整个if表达式的类型是那个计算某事物的分支的类型.

计算值的分支产生类型Int.您可以通过定义half方法而不是值来证明这一点:

scala> def half = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even")
half: Int
Run Code Online (Sandbox Code Playgroud)

如果您确实希望看到它throw有类型Nothing,请将其添加到IDE中并使其显示类型:

val exception: Nothing = throw new RuntimeException("n must be even")
Run Code Online (Sandbox Code Playgroud)

关于half,找不到它,因为它的声明抛出异常,这使得REPL无法绑定值.