Android - java项目转型kotlin踩坑记录

首先,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,就可以解决问题了。

 

目前在转项目的时候暂时只遇到这些问题,之后还有其他问题的话还会继续记录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值