簡體   English   中英

異常拋出類型為“Nothing”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM