位置:首页 > Kotlin > Kotlin空指针安全细节处理:toString与hashCode详解

Kotlin空指针安全细节处理:toString与hashCode详解

时间:2026-08-21  |  作者:多维游侠  |  阅读:0

发现

在Kotlin中调用Ja va方法时,有时会返回一个可能为Null的对象。

此时调用该对象的hashCodetoString方法,不会报空指针异常

然而,在Ja va中若这么做,却会直接抛出空指针异常。

实验

比如我存在下方的一个ja va方法:

class Misc
    public static JSONObject safeParseJson(byte[] data) {
        try {
            return new JSONObject(new String(data));
        } catch (Exception e) {
            return null;
        }
    }
}

上述方法简单易行,为Android解析JSON字符串的过程增添了一层catch异常保护。

一旦发现字符串不符合JSON格式,便会触发catch异常,从而返回Null。

Ja va中的调用表现

我们如果在ja va中使用该方法时候,故意传一个不满足json格式的字符串,然后调用其hashCode方法:

        byte[] invalidJsonBytes = "invalid json".getBytes();
        JSONObject json = Misc.safeParseJson(invalidJsonBytes);
        System.out.println(">>> " + json.hashCode());

运行上方代码,会发现程序直接报错,空指针异常了。

Kotlin中的调用表现

但是如果放在Kotlin中,相同的调用方式:

        val invalidJsonBytes = "invalid json".toByteArray()
        val json = Misc.safeParseJson(invalidJsonBytes)
        println(">>> " + json.hashCode())

运行代码,可以看到程序正常运行,且输出最终结果hashCode为0.

进一步验证

我们加一行判断,看下这个时候返回的对象是否为Null

        val invalidJsonBytes = "invalid json".toByteArray()
        val json = Misc.safeParseJson(invalidJsonBytes)
        println(">>> " + json.hashCode())

        if (json == null) {
            println("==> json is null")
        }

可以看到程序依然正常运行,并且确实也进入到了为null的判断逻辑中。

原因

Kotlin对于部分方法有制作扩展方法。

比如对于hashCode,toString这类方法,都有定义扩展方法。

这些扩展方法里有包含为空指针的情况。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多