Scala 异常抛出的类型为“Nothing”?
如本文所述-: 在Scala中,throw是一个具有结果类型的表达式 从技术上讲,异常抛出的类型为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
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
?换句话说,有没有办法证明typeNothing
?