首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin的@Parcelize在writeToParcel()上抛出NPE

Kotlin的@Parcelize是一个注解,用于自动生成Parcelable接口的实现代码。在使用@Parcelize注解的类中,编译器会自动为该类生成writeToParcel()和createFromParcel()方法,用于将对象序列化到Parcel对象中和从Parcel对象中反序列化出对象。

然而,在某些情况下,当使用@Parcelize注解的类中存在可空属性时,调用writeToParcel()方法时可能会抛出NullPointerException(NPE)。这是因为在生成的writeToParcel()方法中,编译器默认会使用requireNotNull()函数来确保可空属性的非空性,但如果属性为null,则会抛出NPE。

为了解决这个问题,可以通过以下两种方式之一来避免NPE:

  1. 将可空属性标记为@Nullable:在使用@Parcelize注解的类中,将可空属性标记为@Nullable,这样编译器就不会在生成的writeToParcel()方法中使用requireNotNull()函数。示例代码如下:
代码语言:kotlin
复制
@Parcelize
data class MyClass(
    val nullableProperty: String?
) : Parcelable
  1. 使用Elvis运算符处理可空属性:在生成的writeToParcel()方法中,使用Elvis运算符(?:)来处理可空属性为null的情况。示例代码如下:
代码语言:kotlin
复制
@Parcelize
data class MyClass(
    val nullableProperty: String?
) : Parcelable {
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(nullableProperty ?: "")
    }
}

在这个例子中,如果nullableProperty为null,那么writeToParcel()方法会将一个空字符串写入Parcel对象。

总结一下,@Parcelize是Kotlin中用于自动生成Parcelable接口实现代码的注解。当在使用@Parcelize注解的类中存在可空属性时,在调用writeToParcel()方法时可能会抛出NPE。为了避免这个问题,可以将可空属性标记为@Nullable或使用Elvis运算符来处理可空属性为null的情况。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门(21)活动页面的跳转处理

代码与Java代码主要有两点不同之处: 1、类内部指代自身this关键字,Java完整写法是“类名.this”,而Kotlin完整写法是“this@类名”,当然二者均可简写为“this”;...Parcelable类,就得重写包括writeToParcel、createFromParcel、newArray、describeContents在内四个方法,可谓是兴师动众。...第五章类和对象中,介绍了Kotlin对数据类写法,类名前面关键字data,Kotlin即可自动提供get/set、equals、copy、toString等诸多方法。...那么序列化对象改造也相当简单,仅需类名之前增加一行注解“@Parcelize”就好了,整个类Kotlin代码只有下面寥寥几行: @Parcelize data class MessageInfo(...,表示增加安卓插件编译支持: //@Parcelize标记需要设置experimental = true androidExtensions {     experimental = true } 编译文件修改完毕

1.6K30

Kotlin 开发中遇到坑(持续更新)

我们写这段代码时候想可能是:当mUser不为null,而且年级不是-1时候,通过条件判断,然后做一下操作。 但是kotlin中,当mUser为null时,mUser?....方法: 3.1、用 val 而不是 var Kotlin 中 val 代表只读,var 代表可变。建议尽可能多使用 val。val 是线程安全,并且不需要担心 null 问题。...(birthDay, DateTime.now()) } 这也是 Kotlin 代码约定中所提到,当具有下面列举特点时使用属性,不然更推荐使用函数: 不会抛出异常。...。 注意:不要相信 AS 编译器,使用快捷键 Override Method 时,还是需要额外关注参数是否 Nullable?...使用@Parcelize注解实现Parcelable 这里不介绍@Parcelize注解具体使用,只记录使用过程中遇到问题。

4.4K02

Kotlin Android Extensions 未来计划

插件最初由 JetBrains 开发,我们也共同讨论了继续保留 synthetic 利弊: 我们尽力确保可行范围内对 API 长期支持,但我们也希望为开发者提供指导,帮助开发者维护健康代码库并最终赢得用户满意...接下来一年里,我们团队将共同弃用 synthetics,并继续支持我们建议选项——"视图绑定 (View Binding)"。...但是,注解包将更改为 kotlinx.parcelize,并且模块级 Gradle 文件中,您需要开始使用独立 kotlin-parcelize 插件而非 android-kotlin-extensions...您可以 Android 开发者官方网站 找到有关 Parcelize 文档。...长期来看,我们将继续保留 kotlin-parcelize 插件,您也可以继续 Android Studio 问题追踪器 中提交有关 Parcelize 问题。

83530

31 天,从浅到深轻松学习 Kotlin

这篇文章介绍开发者用 31 天学习 Kotlin 心得,深入浅出地介绍了 Kotlin 一些基本特性以及高级用法,对处于不同阶段 Kotlin 开发者来说,提高开发效率和了解 Kotlin 提供一些参考...一个调用让您生成一个新 bundle,它甚至可以处理 Arrays。 Day 9:Parcelize 喜欢 Parcelable 速度,但不喜欢写所有的代码?和 @Parcelize 打个招呼。...用 require 使用前可以检查它们,如果它们是无效将会抛出 IllegalArgumentException。 您封闭类状态是否正确?可以使用 check 来验证。...如果检查值为 false,它将抛出 IllegalStateException。 Day 19:内联 (InLine) 等不及要使用 lambdas 来生成一个新接口?...Android Kotlin 另一个 DSL 是 Anko。Anko 允许您使用声明性代码构建 Android 视图。

2.2K30

小谈 Kotlin 空处理

首先在代码阅读层面,对于有 Java 基础程序员来说阅读 Kotlin 代码基本无障碍,除去一些操作符、一些顺序变化,整体可以直接阅读。 其次代码编写层面,仅需要改变一些编码习惯。...最后在学习方式层面,由于 Kotlin 最终都会被编译成字节码跑 JVM ,所以初入手时完全可以用 Java 作为对比。...在我看来,Kotlin 没有帮开发者解决了 NPEKotlin: 臣妾真的做不到啊),而是通过语言层面增加各种强规则,强制开发者去自己处理可能空指针问题,达到尽量减少(只能减少而无法完全避免)出现...三、强规则之下 NPE 问题 Kotlin 这么严密防御之下,NPE 问题是否已经被终结了呢?答案当然是否定。...,后端没传该值就会抛出空指针异常。 2. 过分依赖 Kotlin 空值检查 private lateinit var mUser: User ...

85810

Kotlin中常见符号详解

Kotlin是一门静态语言,支持多种平台,包括移动端、服务端以及浏览器端,此外,Kotlin还是一门融合了面向对象与函数式编程语言,支持泛型、安全空判断,并且Kotlin与Java可以做到完全交互...现在介绍Kotlin文章已经是铺天盖地,大部分都是从Kotlin基本数据类型介绍起,本文不想重复这样事情,这里从另一面来开始,我们来看看Kotlin各种符号。 ?...操作符 对于NPE 爱好者,我们可以写 b!! ,这会返回一个非空 b 值 或者如果 b 为空,就会抛出一个 NPE 异常: val l = b!!....函数中continue,实际是从匿名函数返回 if (it == 2) return@outer //相当于forEach函数中使用break,实际是跳转到outer之外...还要 :符号,用于类名后表示继承,用于变量后限定变量类型,是Kotlin中最常用符号,这里基本囊括了Koltin中一些常见符号,关于符号就介绍这么多,如有遗漏请再下方留言提出,我将补充

1.7K21

如何把kotlin+spring boot开发项目部署tomcat

本文只讲部署过程,你首先要保证你程序能在IDE里跑起来; 先看看你application.properties中设置端口号与你服务器tomcat端口号是否一致 server.port=80 (...boot,如果没这个东西,你只能手动启动你应用才行 然后配置你project structure ?...上面我选了两种打包形式,一种是war包(war包其实就是一个压缩包,他可以用解压工具解开) 一种是war包exploded形式,就是war包里内容放在一个文件夹里了 这里war包会包含所有依赖库...= 'com.ysl.jna.JnaApplicationKt' (目前我也不知道有没有真实起到作用) 打包操作是在这里完成 ?...之后你可以选择你要打包形式(或者两种形式包都打) ? 打包完成后,你会在你项目子目录中找到打好包 ? 然后把你想要包上传到tomcat服务器上去就可以了

1.5K30

程序里怎么表达“没有”

doSomething(); 通过这个语法,如果nullableUser是null的话,表达式就会直接返回null,而不是抛出一个NPE。...: handleNullError() 如果开发人员真的认为这段代码一定不应该存在null,一旦有了null,最好立刻抛出NPE,立刻修问题,可以这样做: nullableUser!!....doSomething(); kotlin做法对实际工程开发非常友好。不像Optional仅仅是提出了一个“优雅”但实际难以用起来方案。...kotlin给了开发者一个选择:对于null,到底是要严格对待(立刻抛NPE),还是容忍着对待(默认返回null或者自定义处理)。...提示一下:我先看kotlin,再看其他几门语言。因此,本文用kotlin举例子,并不代表C#,swfit和kotlin在这个功能设计谁先谁后。

1.8K31

如何把kotlin+spring boot开发项目部署tomcat

本文只讲部署过程,你首先要保证你程序能在IDE里跑起来; 先看看你application.properties中设置端口号与你服务器tomcat端口号是否一致 server.port=80 (...boot,如果没这个东西,你只能手动启动你应用才行 然后配置你project structure ?...上面我选了两种打包形式,一种是war包(war包其实就是一个压缩包,他可以用解压工具解开) 一种是war包exploded形式,就是war包里内容放在一个文件夹里了 这里war包会包含所有依赖库...= 'com.ysl.jna.JnaApplicationKt' (目前我也不知道有没有真实起到作用) 打包操作是在这里完成 ?...之后你可以选择你要打包形式(或者两种形式包都打) ? 打包完成后,你会在你项目子目录中找到打好包 ? 然后把你想要包上传到tomcat服务器上去就可以了

1.3K60

利用Kotlin如何实现Android开发中Parcelable详解

虽然名字是 MutableList ,但是实际这只是 Kotlin 一个辅助类型,可以用 Tools – Kotlin – Show Kotlin Bytecode 查看它编译成 JVM 字节码之后样子...Parcelable 要求每个实现类都有这个 CREATOR 对象,并且它必须是非空、公有的、静态字段。 Java 程序中,对于每个类 CREATOR 有非常稳定实现。...{ return arrayOfNulls(size) } } Kotlin 中,使用命名 companion object 确实可以生成一个对应名字静态字段,并且它是公有的,会随着类加载而被创建...通过 Kotlin 提供 @JvmField 注解,我们可以让 Kotlin 编译器把它作为一个字段进行处理,那我们可以 companion object 里定义一个 CREATOR ,然后给它加上...requires a Parcelable.Creator… Kotlin编写代码过程中,需要用到parcelable来进行传值,按照以前写法,进行序列化: class PayTypeInfo :

3.2K20

Android Aidl跨进程通讯简单使用

02 创建数据类实现Parcelable接口 前面简介中提到过,AIDL数据类通讯需要实现Parcelable接口,为了省去接口实现代码,Kotlin中通过kotlin-parcelize即可实现了。...build.gradleplugins中加入id("kotlin-parcelize") 创建TestData数据类 package vac.test.aidlservice import android.os.Parcelable...import kotlinx.parcelize.Parcelize @Parcelize data class TestData(var code: String, var name: String...aidl中使用了数据类TestData,所以Aidl文件和数据类文件必须保证同一包名下,并不是说放在同一文件夹下,实体类TestData文件主Code文件夹下(java目录下),包名和aidl文件夹中放置...设置,用到了viewbinding,这两个设置是一想,同时引用了basequickadapter。

63850

Java 9 JShell中 跟Kotlin REPL中尽情体验函数式编程乐趣吧《Kotlin极简教程》正式架:

e.toUpperCase();}).collect(Collectors.toList()); $6 ==> [A, B, C] jshell> alphabet alphabet ==> [a, b, c] Kotlin...b, c] >>> alphabet.map{it->it.toUpperCase()} [A, B, C] >>> alphabet [a, b, c] 相比之下, 我们不得不说,Java 8,9中...不如Kotlin来得直截了当,简单优雅。 毕竟,Kotlin 是对 Java 语言更高层次抽象封装,相比之下, 只能是 “青出于蓝而胜于蓝”。...---- KotlinChina编程社区 微博 非常感谢 if (boy) { 帅气英俊潇洒} else { 魔鬼身材天使脸蛋美丽动人女神气质} 您。大家请多支持!!!...您支持,是我源源不断写作动力! 如果您有任何问题,欢迎随时与我交流~ ----

89610

从 Java 到 Kotlin,再从 Kotlin 回归 Java

你可以使用字符串,代码看起来很安全,但是会抛出空指针异常。...// throws NPE when format() returns null println ("f.len : " + f.length) } 在我看来,Kotlin类型系统中所有这些类似...可以想像那是一个匿名内部类单例实现。而实际,这个类并不是匿名,它名字是 Companion,你可以省略这个名称。明白吗?这很简单。” 我很喜欢对象声明概念——单例是种很有用模式。...上面的代码可能会出错,从 parseInt() 中抛出 NPE。只有值存在时候才能执行 Monad 风格 map(),否则,null 只会简单传递下去。这就是 map() 方便原因。...Kotlin会让你深陷其中。事实Kotlin语法更接近Scala。这是赌全部。你将不得不忘记Java并切换到完全不同语言。 相反,学习Groovy是一个愉快旅程。Groovy亲手引领你。

1.5K10

Duolingo 和 Google Home Kotlin 之旅

应用大受欢迎,团队肯定备受鼓舞,于是决定把最棒创意和功能添加进应用中,然后用户们会更加满意,如此循环……然而如此美妙图景现实中会遇到 "现实问题": 代码量陡增,以及随之而来开发和维护成本 代码中错误也随之增加...Duolingo 是世界最受欢迎语言学习平台之一,也是 Google Play 上下载量最高免费教育应用之一 (已突破 2 亿),为超过 3 亿名学习者提供可免费使用语言学习服务。...△ Duolingo 代码量随时间变化,绿色为 Kotlin 团队博客: 将 Duolingo Android 100% 迁移至 Kotlin 总体而言,迁移到 Kotlin 后,我们非常满意...,也很高兴看到 Kotlin 我们公司和整个软件行业中使用率不断增长!...例如,使用数据类和 Parcelize 插件:  一个使用 Java 时需要手动编写 126 行代码类,现在使用 Kotlin 只需编写 23 行,代码量减少了 80% 。

1.2K20

Kotlin编译与Intrinsics检查

很早时候,小黑屋就介绍过如何研究Kotlin,其中涉及到了查看字节码和反编译成Java代码方式,相信很多人研究过的人,都会或多或少遇到过Intrinsics.checkParameterIsNotNull...出现空指针时抛出throwNpe方法 判断对象相等方法areEqual 其他一些处理数据异常方法和辅助方法 所以上面代码中Intrinsics.checkParameterIsNotNull(...是的,你这句话基本没有毛病,但是有一个前提,那就是空指针和两种类型特性,目前只kotlin中生效,一旦涉及到和Java交互时,就不灵了。...比如我们Java代码中这样调用,不会产生任何编译问题。...非空断言时,会有校验非空断言结果检查,如果有问题,则抛出NPE. 1 2 3 4 5 6 7 8 /** * if (message == null) { Intrinsics.throwNpe

1.5K20

Kotlin初级(2)- - - 空安全.md

空类型、空安全 为了解决类似NPE这类问题,现代编程语言包括Kotlin解决这类问题方法就是把运行时错误转变成编译期错误。...通过支持作为类型系统一部分可空性,编译器就能在编译期发现很多潜在错误,从而减少运行时抛出异常可能性 变量定义 Kotlin变量修饰符只有两个 val修饰变量不能重新被赋值 var修饰变量可以被重新赋值...: 这个操作符表示判断一个可空类型时,会返回一个我们自己设定好默认值 !! 这个操作符判断一个可空类型时,会抛出空指针异常 as? 这个操作符表示为安全类型转换 !! 操作符 !!...操作符可谓是给爱好空引用异常开发者使用,因为使用一个可空类型变量时,改后面加上!!操作符,会显示抛出空指针异常 as?...**操作符则会返回null,但是不会抛出异常 总结 项目中会抛出空指针NullPointerException情况 可空类型变量使用时,用了!!

65530
领券