這裏是排隊方法的拆裝(從ILSpy拍攝)
public void Enqueue(T item)
{
if (this._size == this._array.Length)
{
int num = (int)((long)this._array.Length * 200L/100L);
if (num < this._array.Length + 4)
{
num = this._array.Length + 4;
}
this.SetCapacity(num);
}
this._array[this._tail] = item;
this._tail = (this._tail + 1) % this._array.Length;
this._size++;
this._version++;
}
private void SetCapacity(int capacity)
{
T[] array = new T[capacity];
if (this._size > 0)
{
if (this._head < this._tail)
{
Array.Copy(this._array, this._head, array, 0, this._size);
}
else
{
Array.Copy(this._array, this._head, array, 0, this._array.Length - this._head);
Array.Copy(this._array, 0, array, this._array.Length - this._head, this._tail);
}
}
this._array = array;
this._head = 0;
this._tail = ((this._size == capacity) ? 0 : this._size);
this._version++;
}
正如你所看到的,這是非常簡單的。你可以得到一個StackOverflowException,或OutOfMemoryException,因爲你可以總是潛在得到這些。
除此之外,還不清楚任何事情都可能出錯。您需要通過驗證代碼其餘部分中的各種檢查和保護子句來驗證是否存在NullPointerException的可能性,但粗略一眼顯示這可能不會發生。當然,如果你開始使用反射,你總是可以強制拋出一個NullPointerException異常。
我不知道這是否會對您有所幫助,但我相信它會回答您提出的問題。
「即使它沒有被拋出」是什麼意思?如果沒有被拋出,沒有什麼可以抓到的。一般來說,如果你的進程內存不足,你不可能恢復... –
@JonSkeet在任何方法的文檔中總是會提到該方法拋出的異常......對此特定的方法要麼沒有記錄,要麼id不會拋出任何異常 –
您是否主要是Java程序員?如果是這樣,C#沒有相同的檢查異常概念 - 任何異常都可以從任何方法拋出,儘管文檔*可能*表示*可能*異常。同樣,你可以從任何代碼塊中捕獲任何類型的異常 - 編譯器不會抱怨! –