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

抛出ArgumentNullException
EN

Stack Overflow用户
提问于 2008-12-15 15:41:22
回答 10查看 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

回答 10

Stack Overflow用户

回答已采纳

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

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

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

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

票数 68
EN

Stack Overflow用户

发布于 2008-12-15 18:28:15

我同意快速失败的想法--然而,明智的做法是知道为什么快速失败是可行的。考虑这个例子:

代码语言:javascript
复制
void someMethod(SomeClass x)
{       
    x.Property.doSomething();
}

如果你依靠NullReferenceException来告诉你出了什么问题,你怎么知道什么是空的呢?堆栈跟踪将只给出一个行号,而不是哪个引用为空。在本例中,xx.Property可能都为空,如果没有提前进行积极检查而快速失败,您将不知道它是哪一个。

票数 12
EN

Stack Overflow用户

发布于 2020-03-11 18:58:46

这几天没有理由不结账。C#已经前进了,您可以非常灵活地使用一个丢弃和一个空合并运算符来完成此操作:

代码语言:javascript
复制
_ = declaringType ?? throw new ArgumentNullException(nameof(declaringType));
_ = methodname ?? throw new ArgumentNullException(nameof(methodName));
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/368742

复制
相关文章

相似问题

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