NullPointerExp是无数java程序员都想消除的问题,OC里,nil对象调方法返回的是nil(这种做法,仁者见仁,智者见智);kotlin和swift通过optional机制,通过编程过程中强化Nullable概念,来避免NPE。
dart中,null是一个普通的Null类型对象,首先这点就让人有点困扰了。所以dart不会出现np,但是null调用其他方法会出现noSuchMethod的问题。这个体验就不是很好了。然后引入了null-aware操作符,这个和optional机制有点像,不过做的不彻底,且if的设定有点奇怪。
Dart是一门假装很现代,但实际上有点过时的语言。
先不吐槽了,回归标题吧。
dart语法中支持Null-aware操作符,??
??=
和?.
。
在判断一个字符串是否为空时,我们一般是这样写的:
// 判断不为空
if (str != null && !str.isEmpty()) {
// str is not empty, do something
}
// 判断为空
if (str == null || str.isEmpty()) {
// str is empty, do something
}
在了解到null-aware操作符后,我们是不是可以这么写:
if (!str?.isEmpty()) {
// str is not empty, do something
}
if (str?.isEmpty()) {
// str is empty, do something
}
其实不然,上面的代码是有问题的。具体问题有要从dart的if说起,dart的if判断来看。
Dart中规定,if中当且仅当参数为
bool
类型true
时,为真,其他全部都为假。
知道这条规定,就可以发现上面的问题了:当str为空时str?.isEmpty()
输出的结果为null
,而这在if语句中,实际上相当于false
,那么也就是说当str为空时,str?.isEmpty()
进入了if的false
分支。而相反的,在null
前面加上!
否定后,又变为了true
,即当str为空时,!str?.isEmpty()
反而是进入了true
分支。
这明显是不符合我们期望的逻辑的,所以这种写法是绝对不可取的。
但是dart的string类型还有另一个方法isNotEmpty
,此时这样写:
if (str?.isNotEmpty()) {
// str is not empty, do something
}
if (!str.isNotEmpty()) {
// str is empty, do something
}
str非空时,逻辑肯定没有问题,当str为空时,str?.isNotEmpty
会返回false
,而同样的!str?.isNotEmpty
,就会返回true
,这样恰好就符合我们期望的逻辑了。
不过IDE是不建议if中传null这样非bool类型的对象的,所以你这样写的话会给一个提示:
这里的逻辑确实容易让不了解的人很困惑,所以不建议用以上null-aware操作符来做字符串的空判断。
如果想做一个工具方法来简化字符串的判断,也不用自己重复造轮子,推荐使用官方的quiver.strings这个库,里面涵盖了字符串的一些常用工具方法。
Wrote by Kevin(a2V2aW56aGFuMDQxN0BvdXRsb29rLmNvbQ==)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。