[英]An exception throw has type `Nothing`?
如此處所述 - 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")
然后我去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
^
據說沒有找到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無法綁定一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.