Android开发–Kotlin初体验,java转Kotlin代码及异常排除

itlao6 Android 原创 开发&源码评论873字数 1162阅读3分52秒阅读模式
Kotlin火了一段时间了,近段关于java版权的官司谷歌也输了。趁着最近有时间,了解下Kotlin。为了更方便查看与java开发的区别,决定拿一个小项目直接改成Kotlin代码。

看别人博客的时候发现AS自带有Java转Kotlin的工具,于是,我们可以很方便的使用快捷键 Ctrl + shift + alt + k 实现整个工程的java代码转换。
.java文件都转成了.kt文件。
但是代码中到处是红色错误:文章源自IT老刘-https://itlao6.com/342.html

最典型的就是下面这个,变量初始化问题

Android开发–Kotlin初体验,java转Kotlin代码及异常排除
kotlin-error.jpg

注意黄色提示:"Property must be initialized or be abstract",也就是说Kotlin中定义的变量,要么就定义时初始化,要么就定义成抽象的。普通变量都可以这样解决,但是,如果是View呢?显然不能定义成抽象的,而直接初始化也会存在问题。文章源自IT老刘-https://itlao6.com/342.html

 文章源自IT老刘-https://itlao6.com/342.html

Android开发–Kotlin初体验,java转Kotlin代码及异常排除
TextView-init.jpg

虽然编译不跑错,但是一运行就会NullPointerException:文章源自IT老刘-https://itlao6.com/342.html

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                                                                              at android.content.ContextWrapper.getResources(ContextWrapper.java:

初始化的时候context都还没有初始化,肯定会出现空指针异常。
看来根据提示不能解决view报错的问题了。但是谷歌意图用Kotlin替代Java作为默认开发语言,肯定不会留下这样的坑。在网上一搜,答案立即出来了。Kotlin有个lateinit修饰符。文章源自IT老刘-https://itlao6.com/342.html

 文章源自IT老刘-https://itlao6.com/342.html

Android开发–Kotlin初体验,java转Kotlin代码及异常排除
lateinit.jpg

加上lateinit后,果然不报错了。不过,需要注意的有两点:文章源自IT老刘-https://itlao6.com/342.html

  1. lateinit不能修饰基础数据类型
  2. 访问lateinit修饰的变量,如果没有初始化,会抛出异常UninitializedPropertyAccessException

基础数据类型不能使用lateinit,Kotlin也提供了方案:文章源自IT老刘-https://itlao6.com/342.html

private var mInt: Int by Delegates.notNull<Int>()

解决了变量初始化问题,错误少了90%文章源自IT老刘-https://itlao6.com/342.html

然后看看一些比较关键的,同步Synchronized和volatile

不是吧,没有Synchronized关键字修饰方法?很显然,Kotlin会处理同步问题,它提供了@Synchronized注解来实现同步方法,同时提供了synchronized()函数实现同步块
同样的,Kotlin虽然没有volatile关键字,但是有@Volatile注解文章源自IT老刘-https://itlao6.com/342.html 文章源自IT老刘-https://itlao6.com/342.html

继续阅读
weinxin
我的微信公众号
微信扫一扫关注公众号,不定时更新
itlao6
  • 本文由 发表于 2018年 4月 19日 17:40:25
  • 转载请务必保留本文链接:https://itlao6.com/342.html
评论  0  访客  0
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定