Kotlin和Java互操作时的可空性

注:文中demo的kt版本是1.7.10

一、kotlin语言中的可空性设计

    在Java语言中的NPE(NullPointerException)可以说非常常见,而且诟病已久。
异常排名-NPE排第一
    kotlin做为后起之秀,在空指针的问题上进行了升级,即:把本来运行时才能暴露出来的空指针问题,前置到编译期就能让开发者发现,在编写代码时就显式的声明变量类型是不是可空类型,如果将可空类型赋值给不可空类型,或者不可空类型赋值给可空类型,就会报编译时错误,从而减少在运行时抛出异常的概率。

可空类型赋值给不可空类型编译时错误:
可空类型赋值给不可空类型编译时错误

二、kotlin调用java时的可空性

2.1 kotlin调用java时的平台类型?

    kotlin中调用Java中的变量,会被识别为平台类型,平台类型就像java中的变量一样,可能为空,也可能不为空,需要开发人员在写逻辑代码时正确的理解变量是否可能为空,如果可能为空就必须要进行判空处理,否则就会报NPE,导致程序异常退出。
举例,在kt代码中,调用一个java中的变量:
java代码:

public class LaunchInfo {
    public String type;
}

kotlin调用java的代码:

fun main() {
    println("hello kt!")
    val launchInfo = LaunchInfo()
    // new出来的launchInfo对象的type字段默认为null,
    // 但是在kt中调用java中为null的变量,并没有任何提醒
    var launchType: String = launchInfo.type
}    

如上代码,最终的NPE异常是在运行时被发现,最终其实比直接使用java还多出来一种出现NPE异常的场景,报错如下:

hello kt!
Exception in thread "main" java.lang.NullPointerException: launchInfo.type must not be null
	at com.yyg.kt.HelloKtKt.main(HelloKt.kt:22)
	at com.yyg.kt.HelloKtKt.main(HelloKt.kt)

以上问题是在真实开发过程中遇到过的,本质上还是对kt调用java的可空性处理语法规则不熟悉+逻辑处理不当引起。需要在kt调用java时小心谨慎关注平台类型的可空性,避免在kt调用老的java代码时,报运行时错误,发现时间晚,造成线上问题。

java中不加任何修饰符,被kt调用时可能是可空类型,也可能为空类型:
java中不加任何修饰符,被kt调用时可能是可空类型,也可能为空类型

2.1 在java中使用注解的方式让kt能识别成可空类型

    对于2.1的问题,如果给LaunchInfo的type字段加上@Nullable注解的话,那么在kt代码中是能在编译期报错的。
在java中使用注解的方式让kt能识别成可空类型
java中增加注解的变量类型,在kt中被识别类型对应如下:
java中增加注解的变量类型,在kt中被识别类型对应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/72646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux_5_Shell脚本编程

目录 1 基础1.1 程序组成1.2 程序编程风格1.3 编程语言1.4 编程逻辑处理方式 2 shell 脚本语言的基本结构2.1 shell脚本的用途2.2 shell脚本基本结构2.3 创建shell脚本过程2.4 脚本注释规范2.5 第一个脚本2.6 脚本调试2.7 变量2.7.1 变量2.7.2 变量类型2.7.3 编程语言分类2.7.4…

popen/pclose 函数

函数作用 如果说system在一定程度上是execl的优化版,那么popen就一定程度上是system的优化版,使用popen不仅可以运行代码,还可以获取运行的输出结果(但是system和exec族函数还是非常重要的,也有自己的特定应用场景&am…

python_day19_正则表达式

正则表达式re模块 导包 import res "python java c c python2 python python3"match 从头匹配 res re.match("python", s) res_2 re.match("python2", s) print("res:", res) print(res.span()) print(res.group()) print("…

Docker安装nacos v2.1.1

目录 前言安装nacos安装步骤1:准备1. 安装docker2. 搜索可以使用的镜像。3. 选择合适的redis镜像。3. 也可从docker hub上搜索镜像。 安装步骤2:拉取镜像拉取镜像查看已拉取的镜像 安装步骤3:创建容器创建容器方式1:快速创建容器创…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展,虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中,VR3D课程在线教育平台作为一种新兴的教育方式,正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

用对角线去遍历矩阵

原题链接 用对角线遍历矩阵https://leetcode.cn/leetbook/read/array-and-string/cuxq3/ 算法分析 图一 图二 图三 图四 由上述四个图可以总结得出以下八个结论: 结论1:k属于[0,a(max)b(max)]。 结论2:每一层遍历行最多存在min(m,n)个矩…

小程序发布注意事项

1、使用HBuildx的 发布 功能发布小程序,因为编译完的代码目录不是同一个 如果使用 运行 到小程序,最后发布的版本会显示”无法连接本地服务器“ 2、使用unicloud的云服务 uniCloud发行 | uni-app官网 阿里云的unicloud的话,使用request域名…

高效实用小工具之Everything

一,简介 有时候我们电脑文件较多时,想快速找到某个文件不是一件容易的事情,实用windows自带的搜素太耗时,效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything,本文将介绍如何安装以及使用everything&…

分布式监控平台—zabbix

前言一、zabbix概述1.1 什么是zabbix1.2 zabbix的监控原理1.3 zabbix常见五个应用程序1.4 zabbix的监控模式1.5 监控架构1.5.1 C/S(server—client)1.5.2 server—proxy—client1.5.3 master—node—client 二、部署zabbix2.1 部署 zabbix server 端2.2 …

记一次物理机安装centos7遇到的问题

首先制作U盘镜像(之前装windows的大白菜之类的就没用了) 用的这个UltraISO制作U盘镜像 然后从U盘启动开始安装, 问题一 安装时报错 dracut-pre-udev[351]:modprobe :ERROR:could not insert ‘floppy’ dracut-pre-udev[351]:modprobe…

ctfshow-web8

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 这道题实际上就是一个单纯的布尔型盲注,只不过是过滤了一些东西,一个是过滤的空格,还有一个是过滤了逗号 那么我们需要做的就是对这两个进行绕过,空格还是用/**…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS:本要求基于…

Python Opencv实践 - 在图像上绘制图形

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png") print(img.shape)plt.imshow(img[:,:,::-1])#画直线 #cv.line(img,start,end,color,thickness) #参考资料:https://blog.csdn.ne…

词法分析器的设计与实现

1、实验目的及要求 1.1、实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求 1)对单词…

Windows - UWP - 为UWP应用创建桌面快捷方式

Windows - UWP - 为UWP应用创建桌面快捷方式 前言 这是一个较为简单的方式,不需要过多的命令行。 How 首先Win R -> shell:AppsFolder -> 回车, 这将显示电脑上的已安装应用(Win32 & UWP): 找到想要创建…

38 | 浦发银行股票分析案例

本文将通过一个浦发银行股票分析案例,探讨如何从多个维度对股票进行分析,包括基本面、技术面和市场环境等因素。我们将深入挖掘浦发银行的财务数据、业务模式以及市场定位,以了解其内在价值和潜在风险。同时,我们还将考察技术面的指标,如价格走势、均线形态等,以揭示市场…

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…

java操作mongdb【超详细】

Java操作 搭建 搭建 依赖 <!--mongodb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>配置文件 spring:data:mongodb:host…

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本…

Django配置(部署环境较乱,暂时启用)

django配置 web服务器中部署项目及WSGI简介 web服务器 WSGI 在IIS中部署django项目 安装 wfastcgi &#xff1a;pip install wfastcgi安装IIS&#xff1a; 以上选择项勾选后确定 将CGI文件复制到项目中&#xff0c; 将项目复制到IIS默认目录中 部署IIS 添加变量信息如下…