Java 在哪里捕获和处理空参数?

Java 在哪里捕获和处理空参数?,java,c#,validation,oop,Java,C#,Validation,Oop,当我编写代码时,我经常问自己同样的问题: 我是否必须验证所有参数都不是null?因此,在每种方法中,我都会有如下内容: if (arg1 == null) { throw FooException("..."); } if (arg2 == null) { throw FooException("..."); } 如果没有,哪种情况更可取 最佳做法是什么?视情况而定,如果您想要不同的异常,我想您必须在可能获得空值的所有情况下都这样做。另一种方法是使用DATATYP.Try

当我编写代码时,我经常问自己同样的问题:

我是否必须验证所有参数都不是null?因此,在每种方法中,我都会有如下内容:

if (arg1 == null) 
{
    throw FooException("...");
}

if (arg2 == null) 
{
    throw FooException("...");
}
如果没有,哪种情况更可取


最佳做法是什么?

视情况而定,如果您想要不同的异常,我想您必须在可能获得空值的所有情况下都这样做。另一种方法是使用DATATYP.TryParse()。查一查


希望它能有所帮助。

因为您无论如何都会抛出异常,不验证它们可能只会导致nullpointerexception或类似的情况。我自己并不完全确定最佳实践是什么。

理想情况下,在执行任何可能修改与所述参数相关的任何状态或数据的操作之前,您应该始终验证任何参数。最好尽早以可管理的方式(通过抛出异常)失败,而不是以不一致的状态/数据结束,然后也必须解决

您的方法期望某些数据在那里,在某些情况下,可以安全地假设它确实在那里(比如在私有方法中,它是从验证输入的其他方法调用的)。但是,一般来说,我建议在以下情况下验证参数:

  • 由用户提供
  • 作为API的一部分提供
  • 在系统的模块之间传递
也许值得一看前面的StackOverflow问题。

一如既往,这取决于具体情况

如果您正在编写一个供其他团队/组织使用的API,那么这种带有公共函数先决条件检查的防御性编程可以真正帮助您的用户;使用外部库时,像“传递给foo()的参数不应为null”这样有意义的错误消息比从某个内部类抛出的NullPointerException要好得多


不过,在API之外,我认为这样的检查会使代码过于混乱。不管怎样,使用调试器跟踪抛出的NullPointerException通常非常容易。在支持它们的语言中,您可以考虑使用断言-它们的语法通常不那么繁琐,并且可以在生产上关闭它们,这样检查不会降低性能。您应该检查所有参数。现在,理想情况下,如果您使用良好的设计实践编写代码,那么一个函数最多只能有4个或5个参数

话虽如此,我们应该始终检查函数项中的空值,并抛出适当的异常或IllegalArgumentException(我的fav)


此外,不应将NULL传递给函数,也不应返回NULL。听起来很简单,但它将节省大量代码和bug。也来看看吧。

我觉得这主要取决于常识,还有一点取决于个人喜好

正如其他人所提到的,如果它是一个公共API,那么您希望尽可能提供清晰的错误消息,因此最好在使用参数之前检查参数,并根据您的示例抛出消息异常

若它是内部代码,那个么还有两个其他选项需要考虑:使用断言,或者不必费心验证,而是依赖于调试。根据经验,如果是我期望其他开发人员调用的代码,或者如果条件非常微妙,调试起来可能会很痛苦,我将在其中添加断言。否则,我就让它失败


有时,您可以通过使用。如果它是一个公共API,我仍然倾向于包含检查。

回答得很好。但是请记住,尽管Null设计模式很有趣,但它并不像接受/返回Null那样被广泛使用(尽管我知道Qt使用它)。