簡體   English   中英

值超出數組范圍

[英]Value out of array bounds

我遍歷數組,有時我必須檢查超出邊界的值。 當然,它會引發異常,但我不想在此之后完全停止應用程序,只需跳過此代碼元素即可。

這樣安全嗎,不會導致內存泄漏?

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch
{ // empty for purpose
}

使用if語句等而不是吞咽異常是更好的做法。

您可以在此處查看關於該主題的進一步討論: 為什么空捕獲會阻止一個壞主意?

我會檢查以確保數組中的位置有效

if (arrayName[i - 1, j] != null) 
{
  arrayName[i - 1, j].DoSomething();
}

或使用try / catch,但是將其記錄下來,這樣就不會永遠丟失。

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch(Exception e)
{ 
    _log.Error(e.Message);
}

無論如何,您概述的方法雖然不是最佳實踐,但不會導致內存泄漏

只需檢查索引是否在范圍內即可。 GetLength返回指定尺寸的長度:

if (i - 1 < arrayName.GetLength(0) && j < arrayName.GetLength(1))
{
    if (arrayName[i - 1, j].DoSomething())
        something++;
}

只要您沒有在try塊中分配資源,否則異常不會導致內存泄漏,而異常不會導致它們被釋放(通常是通過Dispose方法)。 如果是這種情況,請考慮使用using塊以確保釋放資源。

目前尚不清楚您要做什么,但似乎您正在嘗試使用異常作為一種避免顯式檢查數組索引是否有效的機制。 (通常)這是一件壞事,因為異常應該用於特殊情況,如果輸入是明智的,並且您沒有合理的方法來防止這種異常 ,那么在這種情況下您不會期望發生異常 如果您提供更多背景信息,我們可能會建議一種更好的方法。

另外,正如kfugslang所說,您幾乎應該始終避免使用空的和不合格的catch塊,因為它們會捕獲try塊中發生的任何異常,而不僅僅是捕獲您希望拋出的異常。 例如,堆棧內部更深處的某些內部方法可能會拋出一個完全不相關的異常,該異常與您自己的代碼無關,只會被吞噬。 您可能不會更明智,但是結果將是不可預測的,並且很可能是錯誤的。

相反,您應僅嘗試對特定的異常類型使用合格的 catch語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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