一千萬個為什麽

搜索

為什麽將NaN轉換為長期產生有效結果?

在下面的示例代碼中,我除以零,當我使用調試器逐步執行時,(dividend/divisor)產生無窮大或NaN(如果除數為零)。當我將此結果轉換為長時間時,我得到一個有效的結果,通常類似於-9223372036854775808。為什麽這個演員有效?為什麽不停止執行(例如拋出異常)而不是分配任意值?

double divisor = 0;
double dividend = 7;
long result = (long)(dividend/divisor);

最佳答案

為什麽這個演員有效?

如果在編譯時已知轉換可能成功或始終成功,則轉換有效。只有在轉換無法成功時,轉換才是非法的。 (例如,將密封類型轉換為未實現的接口。)從double到long的轉換可能會成功。因此演員表是有效的。

為什麽不停止執行(例如拋出異常)而不是分配任意值?

因為你沒有要求例外!該規範非常清楚預期的行為是什麽。見6.2.1節:

對於從float或double到整數類型的轉換,處理取決於轉換發生的溢出檢查上下文:

     

在選中的上下文中,轉換過程如下:

     

•如果操作數的值為NaN或無窮大,則拋出System.OverflowException。

     

[...]

     

在未經檢查的上下文中,轉換始終成功,並按以下步驟繼續。

     

•如果操作數的值為NaN或無窮大,則轉換結果是目標類型的未指定值。

您正在未經檢查的上下文中執行代碼;你沒有要求任何例外,所以你沒有例外。如果你想要一個例外,請求一個;使用檢查的上下文。

轉載註明原文: 為什麽將NaN轉換為長期產生有效結果?