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.
这有什么不对?
据说没有找到一半.但是,基于这本书,我认为它应该说它是定义的,它的类型为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
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无法绑定值.