首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出ArgumentNullException

抛出ArgumentNullException
EN

Stack Overflow用户
提问于 2008-12-15 15:41:22
回答 14查看 92.6K关注 0票数 71

假设我有一个方法,它接受某种类型的对象作为参数。现在假设这个方法被传递了一个null参数,这是一个致命的错误,并且应该抛出一个异常。对我来说,编写这样的代码是否值得(请记住,这只是一个微不足道的例子):

代码语言:javascript
复制
void someMethod(SomeClass x)
{
    if (x == null){
        throw new ArgumentNullException("someMethod received a null argument!");
    }

    x.doSomething();
}

或者当它调用x.doSomething()时,仅仅依靠它抛出NullException对我来说是安全的吗?

其次,假设someMethod是一个构造函数,在调用另一个方法之前不会使用x。我是应该立即抛出异常,还是等到需要x时再抛出异常?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2008-12-15 15:46:11

与不检查参数的NullReferenceException相比,我更喜欢ArgumentNullException。通常,我倾向于在尝试调用可能为空的对象上的方法之前,始终检查是否为空。

如果方法是一个构造函数,那么它将取决于两个不同的因素:属性是否也有一个公共setter,以及对象被实际使用的可能性有多大。如果有一个公共setter,那么不通过构造函数提供有效的实例将是合理的,并且不应该导致异常。

如果没有公共setter,并且可以在不引用注入对象的情况下使用包含对象,那么您可能希望将检查/异常推迟到尝试使用它。我认为一般情况下,注入的对象对于实例的运行是必不可少的,因此ArgumentNull异常是完全合理的,因为实例没有它就无法运行。

票数 68
EN

Stack Overflow用户

发布于 2008-12-15 15:46:12

我总是遵循fail fast的做法。如果您的方法依赖于X,并且您知道X可能会传入null,那么请检查它并立即引发异常,而不是延长故障点。

2016更新:

真实世界的例子。我强烈推荐使用JetBrains Annotations

代码语言:javascript
复制
[Pure]
public static object Call([NotNull] Type declaringType, 
                          [NotNull] string methodName, 
                          [CanBeNull] object instance)
{
    if (declaringType == null) throw new ArgumentNullException(nameof(declaringType));
    if (methodName == null) throw new ArgumentNullException(nameof(methodName));

随着C# 6提供了nameof操作符,Guard语句得到了极大的改进。

票数 38
EN

Stack Overflow用户

发布于 2008-12-15 15:46:57

出于以下原因,我更喜欢显式的例外:

  • 如果方法有多个SomeClass参数,它会让你有机会说出它是哪一个(其他所有东西都可以在调用堆栈中找到)。
  • 如果你在引用x之前做了一些可能有副作用的事情怎么办?
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/368742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档