在发布这个问题并阅读这个问题之后,我意识到知道一个方法应该返回null是非常重要的,或者如果这被认为是一个错误条件并且应该抛出一个exception。 还有一个很好的讨论何时返回“空”或抛出exception 。 我正在写一个方法,而且我已经知道如果我想要返回null还是抛出一个exception,那么expression我的决定的最好方法是什么,换句话说,就是要logging我的合同? 我可以想到的一些方法: 写在规格/文档(任何人都可以阅读?) 使其成为方法名称的一部分(正如我在这里所build议的) 假设每一个引发exception的方法都不会返回null,而每一个“不”抛出的方法都会返回null。 我主要谈论java,但也可能适用于其他语言:为什么有一个正式的方式来表示如果抛出exception( throws关键字),但没有正式的方式来表示,如果null可能会返回? 为什么不存在这样的事情: public notnull Object methodWhichCannotReturnNull(int i) throws Exception { return null; // this would lead to a compiler error! } 总结和结论 合同的expression方式有很多种: 如果您的IDE支持(如IntelliJ),最好使用@NotNull这样的注释,因为它对程序员是可见的,并且可以用于自动编译时间检查。 Eclipse有一个插件可以添加对这些的支持,但是这对我没有任何作用。 如果这些不是选项,则使用自定义types,如Option<T>或NotNull<T> ,这样可以增加清晰度并至less在运行时进行检查。 无论如何,在JavaDoc中logging合同从不会伤害,有时甚至是有帮助的。 使用方法名来logging返回值的可空性并不是除了我之外的任何人提出的,虽然它可能是非常冗长而不总是有用的,但我仍然相信它有时也有其优点。
我有一个具有可为空的ParentId字段的类别实体。 当下面的方法正在执行并且categoryId为空时,结果似乎为空,但是存在具有空ParentId值的类别。 这里有什么问题,我错过了什么? public IEnumerable<ICategory> GetSubCategories(long? categoryId) { var subCategories = this.Repository.Categories.Where(c => c.ParentId == categoryId) .ToList().Cast<ICategory>(); return subCategories; } 顺便说一下,当我改变条件(c.ParentId == null),结果似乎正常。
我经常有一个class级: public class Foo { private String field1; private String field2; // etc etc etc } 这使得field1和field2的初始值等于null。 将所有我的string类字段如下更好? public class Foo { private String field1 = ""; private String field2 = ""; // etc etc etc } 然后,如果我符合类定义,我会避免大量的空指针问题。 这种方法有什么问题?
查询来检查列是否可以为null(列中允许有空值)。 它应该最好返回是/否或1/0或真/假。
我有这个代码。 User对象构造函数有可能以某种方式失败,这样$this->LoggedUser被分配了一个NULL值,并且在构造函数返回后该对象被释放了吗? $this->LoggedUser = NULL; if ($_SESSION['verbiste_user'] != false) $this->LoggedUser = new User($_SESSION['verbiste_user']);
我正在寻找一种方法来轻松地确定是否所有不在列表中的无项目出现在一个连续的切片。 我将使用整数作为非无项目的示例。 例如,列表[None, None, 1, 2, 3, None, None]符合我对连续整数条目的要求。 相反, [1, 2, None, None, 3, None]是不连续的,因为在整数之间没有任何条目。 还有一些例子可以使这一点变得尽可能清楚。 连续 : [1, 2, 3, None, None] [None, None, 1, 2, 3] [None, 1, 2, 3, None] 不连续 : [None, 1, None, 2, None, 3] [None, None, 1, None, 2, 3] [1, 2, None, 3, None, None] 我的第一个方法是使用variables来跟踪我们是否遇到了一个None […]
比方说,我有一个未初始化的MyObject实例: var a:MyObject = null 这是正确的方法来初始化为空?
对于具有单个参数的构造函数,如果参数为null / empty,那么在构造函数中抛出ArgumentNullException是否可以? 或者,是否应该在实际使用该方法的方法中抛出? 谢谢。
有没有更好的方法来做到以下几点: 在继续循环之前,我需要在file.Headers上检查null if (file.Headers != null) { foreach (var h in file.Headers) { //set lots of properties & some other stuff } } 简而言之,如果由于我的代码中发生的缩进级别,在if中写入foreach看起来有点难看。 是会评估的东西 foreach(var h in (file.Headers != null)) { //do stuff } 可能?
什么是相当于以下内容: std::vector<Foo*> vec; vec.push_back(NULL); 当处理boost::shared_ptr ? 它是下面的代码? std::vector< boost::shared_ptr<Foo> > vec; vec.push_back(boost::shared_ptr<Foo>()); 注意:我可能推回很多这样的对象。 我应该在哪里声明一个全局静态的nullPtr对象? 那样只有其中一个必须被修build: boost::shared_ptr<Foo> nullPtr;