我有一個奇怪的問題,我一直在想,但永遠不會看到實際用途。我期待看看是否有足夠的理由。什麼時候處理空指針/引用異常首選做空檢查?
什麼時候處理空指針/引用異常首選做空檢查?如果有的話。
這適用於任何必須處理具有異常處理功能的空指針/引用的語言。
我對此的常見迴應是在執行任何指針/引用之前執行空檢查。如果非null,繼續像正常一樣使用它。如果爲null,則處理該錯誤或將其提升。
即(在C#)
string str = null;
if (str == null)
{
// error!
}
else
{
// do stuff
int length = str.Length;
// ...
}
但是,如果我們不這樣做的檢查,只是一味地使用它,一個異常將提高。
string str = null;
int length = str.Length; // oops, NullReferenceException
// ...
是一個例外,我們當然可以抓住它所以沒有從這樣阻止我們(或有):
string str = null;
try
{
int length = str.Length; // oops, NullReferenceException
// ...
}
catch (NullReferenceException ex)
{
// but that's ok, we can handle it now
}
現在我承認,這不是最乾淨代碼,但它是不低於工作代碼,我通常不會這樣做。但是,有沒有設計模式或者這樣做有用?也許比直接做更有用,事先沒有檢查。
我能想象到的唯一情況可能是有用的是在一個多線程環境中,一個不受保護的共享變量被設置爲null太早。但是這種情況多久發生一次?保護變量的好代碼不會有這個問題。或者如果有人在編寫調試器,並希望顯式拋出異常,只是爲了包裝它或什麼。也許一個看不見的性能好處或消除代碼中其他事物的需要?
我可能已經回答了我的一些問題,但有沒有其他用途來做到這一點?我並不是在尋找,「這樣做只是因爲我們可以」這樣的例子,或者只是寫得不好的代碼,但是它的實際用途。雖然我會保持不變,「沒有實際用處,請檢查一下。」
永遠不會捕獲一個`NullReferenceException`。這意味着你的代碼有些錯誤。 – leppie 2010-12-07 08:30:22
我不確定每個人都明白我的問題的意圖,但是我會從中得出這樣的結論,它從來沒有真正有用,並且在使用它的地方沒有模式。我知道我們不應該在有更好的方法來處理這件事情時這樣做,我只是想知道是否有足夠的理由去做。但是伊格納西奧和豪伊的答案是一個足夠強烈的理由,爲什麼它沒有完成。 – 2010-12-09 01:51:58
我完全不知道爲什麼這是-1。 upvoted,因爲這是一個有趣的問題,但答案可能是語言和平臺特定的。 – scriptocalypse 2011-04-27 23:27:17