欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

起因

在工程中引入了三方的SDK,此SDK使用Java編碼,我們需要實現(xiàn)它的一個回調(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)用接口方法,這里先看一下這個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)什么問題,因為我們在回調(diào)實現(xiàn)的時候加入了非空判斷,但是我們使用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)問題的,因為轉(zhuǎn)換成KT之后,非空判斷也是有的,但是此時AS會在非空判斷的地方報警告??,提示我們Condition 'e != null' is always 'true',習(xí)慣性的就會將這個非空給去掉,去掉之后一運行直接來了一個空指針異常??

分析

AS的Convert Java File 2 Kotlin File功能在轉(zhuǎn)換過程中,如果參數(shù)未使用可空或者非空注解,轉(zhuǎn)換之后默認(rèn)是非空類型,這樣就會導(dǎo)致我們在使用的時候不太注意此參數(shù)的可空類型,有時會丟掉可空檢查,這樣在程序運行的過程中就會出現(xiàn)空指針的可能,再來看看直接使用KT實現(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來編碼,實現(xiàn)TestCallback的時候error(exception?)是默認(rèn)加上了可空(?)的,很明確的告知開發(fā)者需要注意此參數(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)文章

  • Spring循環(huán)依賴產(chǎn)生與解決

    Spring循環(huán)依賴產(chǎn)生與解決

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進(jìn)行一下小小的回顧
    2022-12-12
  • 詳解使用Java代碼讀取并比較本地兩個txt文件區(qū)別

    詳解使用Java代碼讀取并比較本地兩個txt文件區(qū)別

    這篇文章主要為大家介紹了使用Java代碼讀取并比較本地兩個txt文件區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • SpringBoot應(yīng)用剛啟動時服務(wù)報大量超時的問題及解決

    SpringBoot應(yīng)用剛啟動時服務(wù)報大量超時的問題及解決

    在Java項目上線過程中,經(jīng)常遇到的超時問題主要是由于JVM的JIT編譯導(dǎo)致,JIT(Just-In-Time)編譯是Java虛擬機的一項技術(shù),用于提高Java應(yīng)用的性能,它通過將熱點代碼(頻繁執(zhí)行的部分)轉(zhuǎn)換成本地機器碼來優(yōu)化執(zhí)行效率
    2024-11-11
  • java文件操作工具類分享(file文件工具類)

    java文件操作工具類分享(file文件工具類)

    java文件操作工具類(文件工具類)
    2014-01-01
  • Java獲取一個類的隱藏屬性的幾種方法

    Java獲取一個類的隱藏屬性的幾種方法

    這篇文章主要討論了在Java中如何訪問或修改類的私有字段,包括使用公共的getter和setter方法、反射、繼承和序列化機制,文章強調(diào)了尊重類的封裝性,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • mybatis查詢到了數(shù)據(jù),但是實體類個別字段為null問題

    mybatis查詢到了數(shù)據(jù),但是實體類個別字段為null問題

    這篇文章主要介紹了mybatis查詢到了數(shù)據(jù),但是實體類個別字段為null問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java快速排序和選擇排序?qū)崿F(xiàn)實例解析

    java快速排序和選擇排序?qū)崿F(xiàn)實例解析

    這篇文章主要為大家介紹了java快速排序和選擇排序?qū)崿F(xiàn)實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java編寫多功能萬年歷程序的實例分享

    Java編寫多功能萬年歷程序的實例分享

    這里我們來作一個Java編寫多功能萬年歷程序的實例分享,可以查詢公元歷、農(nóng)歷、節(jié)氣與節(jié)日等,十分全面,下面就來具體看一下:
    2016-06-06
  • JAVA中數(shù)組插入與刪除指定元素的實例代碼

    JAVA中數(shù)組插入與刪除指定元素的實例代碼

    下面小編就為大家分享一篇JAVA中數(shù)組插入與刪除指定元素的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析

    java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析

    本文主要介紹了java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評論