聊聊最近项目中kotlin发现的问题吧
最近在重构AI客服模块的时候,发现
1.加载WebView错误
Java代码下使用WebView加载网页没有问题,使用Kotlin就错误了。
错误日志如下:
Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter favicon
该错误日志是发生在WebViewClient中的onPageStarted()方法中的最后一个参数Bitmap favicon
public void onPageStarted(WebView view, String url, Bitmap favicon) {}
解决方法,使用只需要在Bitmap favicon的参数上加个?检查类型为空问题即可。
2.在用tablayout+viewpager+fragment的时候,如果不初始化控件(findviewbyid),会报空指针异常
3.空引用安全
通过其类型系统的定义可以有效的预防空指针的产生。
类型系统:
在Kotlin中,类型系统分为可以持有null类型的(可空引用)和不能为null的(非空引用)。我们以String(引用类型)来举个例子:
var a: String = "kotlin null safety"
a= null // 编译报错
此时,如果使用变量a去访问其属性或者方法,这时候肯定不会导致空指针。
val len = a.length //编译通过
如果我想str为null呢?我们可以声明一个变量为空字符串。可以写成String?:
var b: String? = "kotlin null safety"
b= null // 编译通过
如果用b变量去访问其属性或者方法,那这样就是不安全,编译报错。
val len = b.length // 错误:变量b不能为null
我们可以用下面这种方式来让上述编译通过。
b?.length // 编译通过
如果b变量不能null的话,则返回,这里的类型为Int?,如果b为null的话,则返回null。
除此之外Kotlin还提供了一个非空断言运算符。!!.,可以将任意值转换为非空类型。如果这个值为null时,将会抛出一个空指针异常。开发时,当我们确定要使用的引用一定不会为空,我们这时候对这个引用使用非空断言运算符,如果有意外情况的话,这里就是报错。
运行结果如下: