作为一个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。