kotlin踩坑记录

作为一个Android程序员,最近一直在从java转kotlin,现在已经完全使用kotlin进行开发,中间遇到一些kotlin刚使用容易犯错的地方,在这里记录一下,也是给新加入kotlin大家庭的伙伴一个小分享。

1.条件语句中有非空判断时一般会指定一个else值,如下

java写法为:

String str = "50万“;
if(“万”.equals(str.subString(str.length()-1){
     ....
}

kotlin写法:

var str:String = "50万"
if("万"==str?.subString(str?.length()?:0-1){
     ....
}

使用java的时候if()条件满足执行里面的代码,但是使用kotlin发现进不去,语法编译也是通过的,如果项目大并且是是AS将代码转为kotlin的话这种问题就比较难发现,问题是什么呢?
原因是符号优先级问题,-号优先级高于前面的?:造成返回值错误,正确写法应该是在0前面加个括号。

2.反射中class的问题

例如:

fun goToSleep(context: Context) {
            val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
            try {
                powerManager.javaClass.getMethod("goToSleep", *arrayOf<Class<*>>(Long.javaClass)).invoke(powerManager, SystemClock.uptimeMillis())
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            } catch (e: InvocationTargetException) {
                e.printStackTrace()
            } catch (e: NoSuchMethodException) {
                e.printStackTrace()
            }
        }

这里是由java通过AS转成的kotlin,转之前是没问题的,后面发现会抛异常IllegalAccessException和NoSuchMethodException,为什么呢?
原因是.javaClass在反射中不可用,需要使用Long::class.java。

发布了224 篇原创文章 · 获赞 390 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/cui130/article/details/90265471
今日推荐