我有一个奇怪的问题,我一直在想,但永远不会看到实际用途。我期待看看是否有足够的理由。什么时候处理空指针/引用异常首选做空检查?
什么时候处理空指针/引用异常首选做空检查?如果有的话。
这适用于任何必须处理具有异常处理功能的空指针/引用的语言。
我对此的常见回应是在执行任何指针/引用之前执行空检查。如果非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