如果在字符串返回方法中找不到字符串,则返回替代值

Posted

技术标签:

【中文标题】如果在字符串返回方法中找不到字符串,则返回替代值【英文标题】:Returning an alternative value if a string is not found in a string-returning method 【发布时间】:2012-03-05 20:25:33 【问题描述】:

我有一个返回字符串的方法。在正常操作条件下,可能会返回空字符串或 null。但是,从此方法返回null"" 是一种好的编码习惯吗?

【问题讨论】:

【参考方案1】:

是的,在这种情况下,我更喜欢返回 null 以显示未找到该字符串。空字符串通常用于显示空结果。

另一种方法是抛出一些Exception,但作为程序员,我发现无法处理异常。返回null好多了

【讨论】:

是的,此外,由于抛出异常的开销,它们不应该用于正常操作的通信。 是的 - 为预期结果引发异常是不合适的。返回标志值比更改所有内容以返回“成功”布尔值/枚举并传递字符串 ref 参数的替代方法更容易和更清晰。 @uosef:在决定是否使用异常时,开销应该是最后的想法之一(过早的优化和过早的悲观一样邪恶,默认情况下编写干净的代码)(顺便说一句,尤其是在 C++ 中为真,异常几乎可以无开销地实现) @mesiesta: Returning null is much better. 是 w.r.t.问题还是一般规则? @phresnel:对我来说,这是一条规则......仅在我找不到更好和更简单的解决方案的情况下抛出异常。【参考方案2】:

null 和空字符串之间存在语义差异。一个说“它不是为那个输入定义的”,另一个说“那个输入的正确值是空字符串”。

假设您为 C 的一个子集编写了一个编译器,它允许 main 函数不返回任何内容。你的编译器返回一个带有某种幻想汇编语言的字符串。

// Testcode 0
void main() 

为此,您将返回null,由于缺少右大括号,代码格式不正确(不,不要抛出异常,用户编写的代码中会出现错误)。没有有效的输出。

// Testcode 1
void main()  printf("hello!"); 

为此,您将返回"push 'hello!'\ncall printf"

// Testcode 2
void main() 

为此,您可能会返回"",代码什么也不做,也不返回,但是是有效的。

【讨论】:

【参考方案3】:

这取决于方法的用途,如果您有一个方法string GetCustomerName(int custId),您宁愿在客户不存在时抛出异常,而不是返回null。另一方面,如果有一个方法将字符串的第一个字母更改为大写,并且您在输入中提供了null,则返回null 是可以接受的。

【讨论】:

【参考方案4】:

是的,我认为是这样,(如果您期望该方法产生字符串结果),但如果不是(例如错误/警告),我会考虑在您的方法中引发异常的替代方案。我通常使用这种方法而不是在这种情况下返回字符串。

例如

try

     Validate();

catch(NotValidException ex)

    // Report

如果未在此处捕获的异常将冒泡并更少静默,例如,忘记检查 Validate 方法的返回值。

【讨论】:

但是当由于抛出异常的开销而通常找不到目标字符串(例如缓存未命中)时,可能不应该使用它。【参考方案5】:

null 通常用于“没有字符串”(在某处“未找到”字符串),或者简单地说,没有字符串适用。空字符串更常用于存在字符串但实际上为空的情况。

例如,如果您在 *** 中搜索某个用户的个人资料描述,如果该用户没有输入任何个人资料描述,则空字符串将是正确的结果;和null,如果没有找到这样的用户。

【讨论】:

以上是关于如果在字符串返回方法中找不到字符串,则返回替代值的主要内容,如果未能解决你的问题,请参考以下文章

如果未找到搜索结果,则返回“NULL”对象

如果在 Hive SQL 中找不到匹配项,则提供要加入的备用列

在此方法中找不到对返回的引用

在数据 R 中找不到列名时返回文本

如果在多索引系列中找不到索引,如何返回 NaN?

shell脚本