Scala 异常抛出的类型为“Nothing”?

Scala 异常抛出的类型为“Nothing”?,scala,exception,throw,Scala,Exception,Throw,如本文所述-: 在Scala中,throw是一个具有结果类型的表达式 从技术上讲,异常抛出的类型为Nothing。您可以使用throw作为表达式,即使它实际上不会计算任何值。这一点技术体操可能听起来很奇怪,但在像上一个例子这样的情况下经常很有用。if的一个分支计算一个值,而另一个分支抛出异常并不计算任何内容。整个if表达式的类型就是计算某些东西的分支的类型 例如: val half = if (n % 2 == 0) n / 2 else throw new Runtim

如本文所述-:

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

从技术上讲,异常抛出的类型为
Nothing
。您可以使用throw作为表达式,即使它实际上不会计算任何值。这一点技术体操可能听起来很奇怪,但在像上一个例子这样的情况下经常很有用。if的一个分支计算一个值,而另一个分支抛出异常并不计算任何内容。整个if表达式的类型就是计算某些东西的分支的类型

例如:

val half =
  if (n % 2 == 0)
    n / 2
  else
    throw new RuntimeException("n must be even")
然后我去了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
       ^
scala>val n=1
n:Int=1
scala>val half=if(n%2==0)n/2 else抛出新的运行时异常(“n必须为偶数”)
java.lang.RuntimeException:n必须为偶数
... 29删去
scala>一半
:12:错误:未找到:值为一半
一半
^
这是说找不到
half
。然而,根据这本书,我假设它应该说它是定义的,并且类型为
Nothing

这里怎么了

据说有一半找不到。然而,根据这本书,我 假设它应该说它已定义,并且类型为Nothing

如果你重读那一段,你会发现
half
的类型不应该是
Nothing
,而应该是
Int

整个if表达式的类型是该分支的类型 它可以计算一些东西。

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

scala> def half = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even")
half: Int
如果您确实希望看到
throw
具有类型
Nothing
,请将其添加到IDE中,并使其显示类型:

val exception: Nothing = throw new RuntimeException("n must be even")

关于
half
,没有找到它,因为它的声明引发了一个异常,这使得REPL无法将值绑定到它。

我的问题是,正如书中所述:throw是一个具有结果类型的表达式。但是,异常抛出没有任何类型到val。@ChangLiu它确实有一个值,您根本无法看到它,因为该值从未初始化过(因为它在初始化时抛出异常)。您可以看到,使用方法定义(
def
)或函数,可以看到返回类型是
Int
。如果它从未初始化,异常抛出的类型为
Nothing
的语句从何而来?其中显示类型
Nothing
?换句话说,有没有办法证明type
Nothing