最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Convert Kotlin空指針異常的解決方法

 更新時(shí)間:2023年05月30日 08:32:32   作者:Taonce  
本文主要介紹了Java?Convert?Kotlin空指針異常的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

不知道大家在使用Kotlin進(jìn)行編碼的時(shí)候,有沒有直接使用AS的Code -> Convert Java File 2 Kotlin File這個(gè)功能,此功能在日常使用中還是比較實(shí)用的,可以幫助我們將老的Java或者復(fù)制的Java代碼(??)一鍵轉(zhuǎn)換成Kotlin代碼,最近在使用此功能的時(shí)候竟然遇到了空指針的Crash,在此記錄一下,順便也給大家做個(gè)預(yù)警。

起因

在工程中引入了三方的SDK,此SDK使用Java編碼,我們需要實(shí)現(xiàn)它的一個(gè)回調(diào)方法做一下異常處理,SDK具體方法就不貼出來了,下面模擬一下他們的回調(diào)

public class Test {
? ? // 定義回調(diào)接口,其中error用來處理異常情況,參數(shù)為Exception對象
? ? public interface TestCallback {
? ? ? ? void test();
? ? ? ? void error(Exception e);
? ? }
? ? // 傳入回調(diào)并直接模擬調(diào)用它的方法
? ? public void setTest(TestCallback testCallback) {
? ? ? ? testCallback.test();
? ? ? ? testCallback.error(new Exception("test"));
? ? }
}

模擬了它們的回調(diào)接口,然后在setTest(callback)中直接調(diào)用接口方法,這里先看一下這個(gè)error的接口方法,它的參數(shù)exception并沒有使用可空(@Nullable)或者非空(@NonNull)注解來定義,默認(rèn)就是可空類型。

然后我們直接模擬調(diào)用下看看具體效果,先用Java代碼來調(diào)用

public class Java2Kt {
? ? private final Test testCallback = new Test();
? ? public void test() {
? ? ? ? testCallback.setTest(new Test.TestCallback() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void test() {
? ? ? ? ? ? ? ? Log.d("taonce", "Java2Kt test");
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void error(Exception e) {
? ? ? ? ? ? ? ? if (e != null) {
? ? ? ? ? ? ? ? ? ? Log.d("taonce", "Java2Kt error " + e.getMessage());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
}
#?
Java2Kt test
Java2Kt error java.lang.Exception: custom exception

這樣就沒得毛病,可以正確調(diào)用并輸出日志,然后我們改一下setTest(callback)方法,再額外添加一行

public void setTest(TestCallback testCallback) {
    testCallback.test();
    testCallback.error(new Exception("test"));
    // 新增
    testCallback.error(null);
}

即使我們在error()調(diào)用的地方傳入null也不會出現(xiàn)什么問題,因?yàn)槲覀冊诨卣{(diào)實(shí)現(xiàn)的時(shí)候加入了非空判斷,但是我們使用Convert Java File 2 Kotlin File轉(zhuǎn)換成Kotlin之后再看看代碼

class Java2Kt {
? ? private val testCallback = Test()
? ? fun test() {
? ? ? ? testCallback.setTest(object : TestCallback {
? ? ? ? ? ? override fun test() {
? ? ? ? ? ? ? ? Log.d("taonce", "Java2Kt test")
? ? ? ? ? ? }
? ? ? ? ? ? override fun error(e: Exception) {
? ? ? ? ? ? ? ? if (e != null) {
? ? ? ? ? ? ? ? ? ? Log.d("taonce", "Java2Kt error " + e.message)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? })
? ? }
}

這樣乍一看是不會出現(xiàn)問題的,因?yàn)檗D(zhuǎn)換成KT之后,非空判斷也是有的,但是此時(shí)AS會在非空判斷的地方報(bào)警告??,提示我們Condition 'e != null' is always 'true',習(xí)慣性的就會將這個(gè)非空給去掉,去掉之后一運(yùn)行直接來了一個(gè)空指針異常??

分析

AS的Convert Java File 2 Kotlin File功能在轉(zhuǎn)換過程中,如果參數(shù)未使用可空或者非空注解,轉(zhuǎn)換之后默認(rèn)是非空類型,這樣就會導(dǎo)致我們在使用的時(shí)候不太注意此參數(shù)的可空類型,有時(shí)會丟掉可空檢查,這樣在程序運(yùn)行的過程中就會出現(xiàn)空指針的可能,再來看看直接使用KT實(shí)現(xiàn)回調(diào)的代碼

test.setTest(object : Test.TestCallback {
    override fun test() {
        Log.d("taonce", "MainActivity test")
    }
    // 默認(rèn)為可空類型
    override fun error(e: Exception?) {
        Log.d("taonce", "MainActivity test ${e?.stackTraceToString()}")
    }
})

如果直接使用KT來編碼,實(shí)現(xiàn)TestCallback的時(shí)候error(exception?)是默認(rèn)加上了可空(?)的,很明確的告知開發(fā)者需要注意此參數(shù)可能為空,需要在使用的時(shí)候加上可空判斷。所以直接使用KT是大概率的不會出現(xiàn)空指針的情況了。

小結(jié)

AS的Convert Java File 2 Kotlin File功能固然是給開發(fā)者提供了便捷的操作,但是也需要開發(fā)者使用之后謹(jǐn)慎判斷

對于自己使用Java寫的一些回調(diào),盡可能的加上可空或者非空的注解,可以給調(diào)用者提供一些警示信息

在日常編碼中,編碼細(xì)節(jié)一定要處理得當(dāng),空指針無可避免但也需要最大化的避免此種異常,KT在這方面已經(jīng)為開發(fā)者提供了較為安全的操作了

到此這篇關(guān)于Java Convert Kotlin空指針異常的解決方法的文章就介紹到這了,更多相關(guān)Java Convert Kotlin空指針異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?split方法使用超詳細(xì)講解

    Java?split方法使用超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java?split方法使用的相關(guān)資料,Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,需要的朋友可以參考下
    2023-10-10
  • 深入理解Spring中的循環(huán)依賴

    深入理解Spring中的循環(huán)依賴

    Spring在注入bean的時(shí)候會做循環(huán)依賴檢查,下面這篇文章主要給大家介紹了關(guān)于Spring中循環(huán)依賴的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-05-05
  • IDEA運(yùn)行SpringBoot測試報(bào)錯(cuò)“命令行過長”的解決方法

    IDEA運(yùn)行SpringBoot測試報(bào)錯(cuò)“命令行過長”的解決方法

    文章介紹了在使用IDEA啟動SpringBoot項(xiàng)目時(shí)遇到的命令行太長錯(cuò)誤,并提供了兩種解決方法:修改運(yùn)行配置和直接編輯workspace.xml文件,需要的朋友可以參考下
    2026-02-02
  • Java 通過JDBC連接Mysql數(shù)據(jù)庫

    Java 通過JDBC連接Mysql數(shù)據(jù)庫

    本文給大家詳細(xì)介紹了java如何使用JDBC連接Mysql的方法以及驅(qū)動包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫的方法,有需要的小伙伴可以參考下。
    2015-11-11
  • MyBatis-Plus 快速入門案例(小白教程)

    MyBatis-Plus 快速入門案例(小白教程)

    這篇文章主要介紹了MyBatis-Plus 快速入門案例(小白教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring?Security?基于URL的權(quán)限判斷源碼解析

    Spring?Security?基于URL的權(quán)限判斷源碼解析

    這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實(shí)現(xiàn)自己的基于請求Url的授權(quán)只需自定義一個(gè)?AccessDecisionManager即可,接下來跟隨小編一起看看實(shí)現(xiàn)代碼吧
    2021-12-12
  • ES結(jié)合java代碼聚合查詢詳細(xì)示例

    ES結(jié)合java代碼聚合查詢詳細(xì)示例

    es查詢有一個(gè)很常用的一種叫聚合查詢,相當(dāng)于mysql中的分組group by 后拿各組數(shù)量進(jìn)行統(tǒng)計(jì),實(shí)現(xiàn)起來也是很簡單,下面這篇文章主要給大家介紹了關(guān)于ES結(jié)合java代碼聚合查詢的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析

    SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析

    這篇文章主要介紹了SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Maven項(xiàng)目中引入本地JAR包的兩種常見方式

    Maven項(xiàng)目中引入本地JAR包的兩種常見方式

    在開發(fā)Java項(xiàng)目時(shí)我們經(jīng)常會遇到需要引入外部本地jar包的情況,這篇文章主要介紹了Maven項(xiàng)目中引入本地JAR包的兩種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Java基于狀態(tài)模式實(shí)現(xiàn)的文檔編輯模式切換功能實(shí)例

    Java基于狀態(tài)模式實(shí)現(xiàn)的文檔編輯模式切換功能實(shí)例

    這篇文章主要介紹了Java基于狀態(tài)模式實(shí)現(xiàn)的文檔編輯模式切換功能,結(jié)合實(shí)例形式詳細(xì)分析了狀態(tài)模式的概念、原理及java使用狀態(tài)模式實(shí)現(xiàn)文檔編輯模式切換操作相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05

最新評論

永登县| 成武县| 阿图什市| 武威市| 怀仁县| 泌阳县| 易门县| 武城县| 通化县| 乐陵市| 西充县| 上杭县| 苏州市| 黎川县| 苗栗市| 泸西县| 右玉县| 保德县| 扎赉特旗| 长兴县| 依兰县| 明水县| 灵山县| 康马县| 江口县| 屯昌县| 班戈县| 广东省| 延川县| 乐安县| 咸丰县| 南宁市| 阳朔县| 淮北市| 清镇市| 青浦区| 星座| 深水埗区| 偏关县| 腾冲县| 大石桥市|