Kotlin <-> Java互调问题:Parameter specified as non-null is null

Kotlin <-> Java互调问题:Parameter specified as non-null is null

1.问题原因

通常是Java调用Kotlin代码在传递参数时出现的问题,Kotlin中设置参数类型不可为空,但是Java调用时传递了null导致。

举例说明:
以Glide加载图片为例

var url:String?=null
     Glide.with(context).load(url).listener(object : RequestListener<String?, GlideDrawable?> {
            override fun onException(e: Exception, model: String?, target: Target<GlideDrawable?>?, isFirstResource: Boolean): Boolean {
              //...省略
                return false
            }

            override fun onResourceReady(resource: GlideDrawable?, model: String?, target: Target<GlideDrawable?>?, isFromMemoryCache: Boolean, isFirstResource: Boolean): Boolean {
             	//...省略
                return false
            }
        }).into(imageView)

在onException方法中参数e:Exception为不可空类型,我们看下编译之后的代码。

     Glide.with(context).load(url).listener((RequestListener)(new RequestListener() {
                public boolean onException(@NotNull Exception e, @Nullable String model, @Nullable Target target, boolean isFirstResource) {
                   Intrinsics.checkParameterIsNotNull(e, "e");
                   //...省略
                   return false;
                }

                // $FF: synthetic method
                // $FF: bridge method
                public boolean onException(Exception var1, Object var2, Target var3, boolean var4) {
                   return this.onException(var1, (String)var2, var3, var4);
                }

                public boolean onResourceReady(@Nullable GlideDrawable resource, @Nullable String model, @Nullable Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                 //...省略
                   return false;
                }

                // $FF: synthetic method
                // $FF: bridge method
                public boolean onResourceReady(Object var1, Object var2, Target var3, boolean var4, boolean var5) {
                   return this.onResourceReady((GlideDrawable)var1, (String)var2, var3, var4, var5);
                }
             })).into(this.imageView);

最重要的代码为 Intrinsics.checkParameterIsNotNull(e, “e”); 在该方法中会进行参数是否为空的校验。

  public static void checkParameterIsNotNull(Object value, String paramName) {
        if (value == null) {
            throwParameterIsNullException(paramName);
        }
    }
    private static void throwParameterIsNullException(String paramName) {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

        // #0 Thread.getStackTrace()
        // #1 Intrinsics.throwParameterIsNullException
        // #2 Intrinsics.checkParameterIsNotNull
        // #3 our caller
        StackTraceElement caller = stackTraceElements[3];
        String className = caller.getClassName();
        String methodName = caller.getMethodName();

        IllegalArgumentException exception =
                new IllegalArgumentException("Parameter specified as non-null is null: " +
                                             "method " + className + "." + methodName +
                                             ", parameter " + paramName);
        throw sanitizeStackTrace(exception);
    }

如果参数为null最终就会抛出*"Parameter specified as non-null is null: " + "method " + className + “.” + methodName + ", parameter " + paramName);异常*。

2.解决办法

解决的办法也很简单,只要在Java调用Kotlin时注意参数是否可空就可以了。如果参数可以为null那就就要在Kotlin代码中加上?以标示为可空类型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值