Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StringUtils vs!=无效的_Java_String_Validation_Nullpointerexception - Fatal编程技术网

Java StringUtils vs!=无效的

Java StringUtils vs!=无效的,java,string,validation,nullpointerexception,Java,String,Validation,Nullpointerexception,我经常遇到非常不同的字符串验证,我们都知道有新的库,比如StringUtils。有人能解释一下为什么StringUtils.isNotBlank(paymentTerm)或多或少优于paymentTerm!=空值 我觉得这个问题的前提已经不正确了。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用null,尤其是当存在另一个非空的sentinel值时。而且String已经有了一个非常好的“空”值:空字符串(“) 如果需要将“和”折叠成相同的值,那么在标准库中已经有了一个非常好的

我经常遇到非常不同的字符串验证,我们都知道有新的库,比如StringUtils。有人能解释一下为什么
StringUtils.isNotBlank(paymentTerm)
或多或少优于
paymentTerm!=空值

我觉得这个问题的前提已经不正确了。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用
null
,尤其是当存在另一个非空的sentinel值时。而且
String
已经有了一个非常好的“空”值:空字符串(

如果需要将
折叠成相同的值,那么在标准库中已经有了一个非常好的方法:
.trim()
。但是,
.trim()
作为
字符串
上的实例方法,仅适用于非空字符串。这不一定是坏事

如果
null
对您来说意味着不同的东西,那么我认为您的数据模型太复杂了,您应该使用其他包装类,而不是直接使用
String
。如果
null
的意思相同,那么您应该选择其中一个,并始终如一地使用它。这可能意味着需要一些
!=null
检查,但是如果您发现自己在整个代码库中经常需要一个
isnull或empty
isNotBlank
帮助函数,我会说这是一种代码气味,您真的应该致力于解决底层数据模型问题,而不是担心一个很小的帮助函数

这是什么意思?在这个问题中,得票最多的答案指出,实际上只有两种情况下值可以为null:要么(1)null是有效值,要么(2)null不是有效值

案例(2)不是很有趣。Null不是有效值,因此我们不应该尝试处理它。如果有的话,我们只要在遇到异常时抛出一个异常即可。否则我们忽略它,让
NullPointerException
自然发生。它不应该为null,因此根据定义,查找null是一种例外情况

如果null是有效值,则表示null具有语义含义。很可能是指某个值“不存在”或“无效”。这里有两个子情况:(1a)null表示与空字符串相同的内容,或者(1b)表示不同的内容

如果您有案例(1b),那么我认为您的域模型中需要一个新实体。例如,您可以创建一个类似于
PaymentTerm
的类,该类具有单独的
.isValid()
.isPresent()
方法,以及一个
.asString()
访问器来获取字符串值(如果存在)。(创建一个
PaymentTerm
类有很多可能的方法,有很多可能的折衷:重点不是你需要这个特定的表单,而是你需要的不仅仅是一个原始
字符串,一个你可以挂起方法的东西,因为这个东西现在在你的领域模型中是一流的实体。)

如果有case(1a),那么null和空字符串在语义上都表示相同的意思。但是他们在语法上是非常不同的!空字符串已经有了一个实例方法来检查它(
.isEmpty()
),并且可以安全地存储、传递、与其他字符串进行比较等等

因此,案例(1a)有两种可能的解决方案:(1a.1)传递null和空字符串,并在任何地方检查其中一种,或者(1a.2)尽快将null规范化为空字符串,然后将null视为无效值,并在任何地方使用空字符串。根据您的输入格式,您甚至可能“免费”获得此行为(例如,空文本框自然将空字符串作为值,而不是null)

我的论点是,案例(1a.1)是一种代码气味。与其同时传递null和空字符串,并经常检查两者(手动或使用类似
isNullOrEmpty
isNotBlank
的方法),您应该尝试进入案例(2)或案例(1a.2)

注意,这个答案实际上意味着
不是空的
!=空值
是次优值!在一个考虑因素充分的代码库中,您应该努力避免这两种情况,但我倾向于认为您应该努力避免类似
isNotBlank
的情况


也就是说,如何检查null或空字符串并不十分重要。无论如何,JIT几乎肯定会内联检查,在许多情况下,窥视孔优化器将完全省略检查,如果它可以用另一种方式证明空安全性。要考虑的更重要的事情是<代码> null >代码>是否是程序中的一个有效值,如果是的话,它意味着一个值为null。

我觉得这个问题的前提已经是不正确的。您不必在大多数地方检查空字符串——事实上,我认为您应该尽可能避免使用
null
,尤其是当存在另一个非空的sentinel值时。而且
String
已经有了一个非常好的“空”值:空字符串(

如果需要将
折叠成相同的值,那么在标准库中已经有了一个非常好的方法:
.trim()
。但是,
.trim()
作为
字符串
上的实例方法,仅适用于非空字符串。这不一定是坏事

如果
null
对您来说意味着不同的东西,那么我认为您的数据模型太复杂了,您应该使用其他包装类,而不是直接使用
String
。如果
null
“”if (myString != null && myString.length() == 8)
if (StringUtils.isNotBlank(myString) && myString.length() == 8)
if (myString != null && myString.contains("word"))
if (String.isNotBlank(myString) && myString.contains("word"))  
if ("word".equals(myString))
if (StringUtils.isNotBlank("word"))