首先,java程序员在写kotlin最可能犯的第一个错误,就是new一个对象。常见报错为:
Please specify constructor invocation; classifier 'xxx' does not have a companion object
对于kotlin来说,我要的不是一个new,只要你跟我明确是变量还是常量,然后告诉我赋值什么类型就好。
例如EZAccessToken accessToken = EZOpenSDK?.getInstance()?.getEZAccessToken();
我们只需要改成
val accessToken = EZOpenSDK.getInstance().getEZAccessToken();
就可以了。
第二个坑,踩到了这个:
property getter or setter expected
我遇到这个问题的时候,是因为不知道怎么将java的函数变成kotlin的函数。在kotlin里,函数的声明需要用到fun,跟java的函数声明有一些区别,具体可见上一篇博文。
第三个坑,
Kotlin: Expression 'length' of type 'Int' cannot be invoked as a function. The function 'invoke()' is not found
这个问题我也是云里雾里的,错误代码是
deviceInfo.getCameraInfoList().size()
然后就报错了。解决方法也很简单,只要把size()改成size就可以了,但是具体是因为什么地方犯错了我也没找到答案。
第四个坑,
not nullable value required to call on for -loop后面的字符被吞了。。。
这个错误是因为在使用for循环的时候,我用了
for ( ezDeviceInfo in mDeviceInfoList) {}
而mDeviceInfoList是一个全局变量,在最开始的时候我声明了:
private var mDeviceInfoList: List<EZDeviceInfo> ?= null;
而这样声明的话,就会导致出现一种情况,我在给mDeviceInfoList赋值之前,它是null,那么我在for循环调用的时候,赋值也可能是个null,这在for循环里是不被允许的。因此,我们会引申出另一个修饰符:lateinit。
使用lateinit的话,变量就不会变成Nullable。因此这个变量的声明要改为:
private lateinit var mDeviceInfoList: List<EZDeviceInfo>
之前没用lateinit的时候,试过在后面添加问号:for ( ezDeviceInfo in this?.mDeviceInfoList?) {}
这样会引发另一个错误:
Smart cast is impossible, because the property could have been changed by this time
这个错误的普遍解决方法是添加非空判断,可惜添加非空判断的话,在该判断内如果有赋值,判断外的调用赋值的变量的话,依然会被判断为空。编译失败。例如:
if(mDeviceInfoList != null){
for ( ezDeviceInfo in mDeviceInfoList) {
Log.d("EZDeviceInfo", ezDeviceInfo.getDeviceName() + ";;SN=" + ezDeviceInfo.getDeviceSerial() + ";; type=" + ezDeviceInfo.getDeviceType());
//比较的自己的摄像头底部上写的序列号
if (serialNo.equals(ezDeviceInfo.getDeviceSerial())) {
deviceInfo = ezDeviceInfo;
break;
}
}
}
if(deviceInfo == null){
return;
}
//获取使用的摄像头信息
val cameraInfo = getCameraInfoFromDevice(deviceInfo,0);//此处会报错
并且这个报错并不会给你任何错误提示,只是单纯地下划一个红线。
因此,在这个例子里,只需要将上面的mDeviceInfoList的声明改成lateinit,就可以解决问题了。
目前在转项目的时候暂时只遇到这些问题,之后还有其他问题的话还会继续记录。