Kotlin调用Java代码时引起空指针异常,要怎么避免?

前提

在Android项目中,经常会出现Kotlin 代码调用Java代码的情况,而在Kotlin编译器中,有这样一个默认的规定,如果Java中的代码被Nullable标记才认为是可控类型,否则, 如果你不指定为可空类型,利用类型推断会直接断定为非空类型。

代码示例:

# Java代码
public class Tools {
	public static String getStr1() {
		// 此处返回一个可能为null的String
	}
	
}

# Kotlin 代码
val str1 = Tools.getStr1()  // 类型推断为非空类型,如果此时直接调用str1.xxx则会产生空指针异常。
解决方案有两种:
1、我们可以提前指定一下类型为可空
val str1: String? = Tools.getStr1()

2、 在Java代码中增加@Nullable注释
public class Tools {
	@Nullable
	public static String getStr1() {
		// 此处返回一个可能为null的String
	}
}

开发时注意点

1、作为开发者新建的Java类,利用好@Nullable@Nonnull注释

在Java里边最麻烦的便是空指针异常,而即使转到了Kotlin,当调用Java 代码时,仍然会存在这样的问题。所以,在我们写java代码时,就要注意,对于可控类型先用@Nullable标记下。

2、使用Kotlin调用系统Java代码时,若存在返回值,请先确认是否可空

老的Java代码、或者第三方代码很少会有@Nullable注释,包括Android框架中的代码,也不是所有的地方都加了该注释,这样不利于Kotlin编译器进行类型推断,当没被@Nullable标记时,我们写代码时,会默认为非空类型。此时我们需要确认对应的代码是否可空,如果可空,请先指定为可控类型。

案例:

在Android 通知栏Notification中有这样一个属性:contentView

val notificaiton: Notification……
val layoutId = notification.contentView.layoutId

在大多数情况下是没问题的,但是在一些情况下,contentView压根就不存在,就会返回空值。

 @Deprecated
 public RemoteViews contentView;

这是Android官方的定义,没有标记@Nullable,而在某些机型中,就会获取到空值。

你可能感兴趣的:(Android,Notes,Android开发系列,kotlin,java,android)