Tag: kotlin null safety

Kotlin不可为空值可以为null?

我有后端,返回给我一些JSON。 我解析到我的课堂: class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String) 使用gson转换器工厂: Retrofit retrofit = new Retrofit.Builder() .baseUrl(ENDPOINT) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); 并在我的界面: interface MyAPI { @GET("get_data") Observable<List<SomeData>> getSomeData(); } 然后我从服务器(与rxJava)检索数据没有任何错误。 但我期待一个错误,因为我认为我应该这样做(为了防止GSON转换器错误,因为notNullableValue不存在于我的JSON响应): class SomeData @JvmOverloads constructor( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "") 在从后端接收数据并解析到具有不带def值的构造函数的我的SomeData类之后, notNullableValue […]

处理一个可以在kotlin中返回null的对象

Android Studio 3.0 我有我的项目转换为Kotlin的Java代码。 public String getAuthUserEmail() { FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); String email = null; if (user != null) { email = user.getEmail(); } return email; } 我已经把它转换成这样的koklin: fun getAuthUserEmail(): String? { val user: FirebaseUser? = FirebaseAuth.getInstance().currentUser return user?.email } 我只是想知道我的kotlin版本,如果用户恰好为null。 我是否需要有一个if条件来检查用户是否为空? 我可以把这个功能当作一条线 fun getAuthUserEmail(): String? { return FirebaseAuth.getInstance().currentUser.email? } 而调用函数是否需要处理可能从函数返回的空字符串? 非常感谢您的任何建议

Kotlin .let {} null安全性大概是错误的错误

当使用.let { }函数时,我注意到在执行以下操作时: bucket?.assignedVariantName.let { bucket?.determineVariant() <– guarantee safety for bucket } 在这种情况下,你必须保证铲斗的安全性bucket?. 或bucket!! 而无效的安全已经通过使用?.let然后我注意到当做以下事情: bucket?.assignedVariantName?.let { <– added safety check for property bucket.determineVariant() <– doesn't need to guarantee safety for bucket } 虽然使用桶的属性而不是直接在桶上,我想知道这是故意的还是Kotlin插件中的错误(在这种情况下,我在Android Studio中遇到了这个问题) 额外的信息是,在这种情况下桶是一个local val而assignedVariantName是一个可为空的var。 val bucket: T? = …

Java to Kotlin转换器和可空方法参数

我遇到了一个Java到Kotlin转换器不能将方法参数标记为可空的情况,使我失败的案例。 示例:使用registerActivityLifecycleCallbacks跟踪活动生命周期: registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityResumed(Activity activity) {} // … other overriden methods }); 将此代码粘贴到Kotlin结果中: registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {} override fun onActivityStarted(activity: Activity) {} override fun onActivityResumed(activity: Activity) {} override fun […]

kotlin函数返回null

我正在尝试一些与kotlin的android开发。 在我的情况下,我想覆盖:ContentProvider我必须覆盖函数“查询”。 “查询”返回“光标”类型。 但是,当我用database.query在函数中创建Cursor实例时,我找回了一个“Cursor?” 类型。 所以我只能返回游标,如果它不是null,但是如果它是null,我该怎么办? 这基本上是这样的: override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor { val cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder) // make sure that potential listeners are getting notified cursor?.setNotificationUri(getContext()?.getContentResolver(), uri) if(cursor != null) return cursor else // what to do here? […]

空指针异常与地图(Kotlin)

我有以下班级: class SymbolTable(){ var map = mutableMapOf<String, Entry>() var kindCounter = mutableMapOf<String, Int>() fun define(name:String, kind:String, type:String){ if(kindCounter[kind]==0){ kindCounter[kind]=0 } var index = 1 map[name]= Entry(type, kind, index) kindCounter[kind]=kindCounter[kind]!!.plus(1) } 类入口看起来像这样: class Entry(var type:String, var kind:String, var index:Int) 主要: fun main(args:Array<String>){ var example = SymbolTable() example.define("ex1", "ex1", "ex1") example.define("ex2", "ex2", "ex2") } 当我运行程序,并尝试使用“定义”功能,我得到以下错误: Exception in […]

如何在Android Activity上使用Kotlin扩展函数进行空检查

我是Kotlin的新手,并试图将我们现有代码库中的许多Android Util方法之一转换为Kotlin扩展函数。 这是Kotlin代码: fun Activity?.isAlive(): Boolean { return !(this?.isFinishing ?: false) } 这意味着等同于这个Java方法: public static boolean isAlive(Activity activity) { return activity != null && !activity.isFinishing(); } 但是,当Activity为null时,我仍然在Kotlin代码中获得NPEs 。 任何想法,我要去哪里错了?

Kotlin在null上的非null断言

由于Kotlin有非null断言,我发现了一些有趣的东西… val myvar: String = null!! 它会崩溃。 但重点是,它不会在编译时检查。 该应用程序将在运行时崩溃。 不应该抛出编译时错误?

Kotlin – lateinit VS任何? = null

在Kotlin中,似乎有两种方法在对象内部声明一个变量,该变量可以是null,并在创建对象后实例化。 var myObject : Any? = null 要么 var lateinit myObject : Any 我很困惑为什么需要lateinit关键字,如果我们可以让var为空并在稍后分配它。 每种方法的优缺点是什么?每种方法应该在什么情况下使用?

困扰Kotlin的空安全

我是Kotlin的新手,在Kotlin读了不止一次的关于Null安全的知识 ,但是我很困惑,不太清楚。 任何人都可以帮助我回答以下问题: 什么! fun getString(key: String!)字符fun getString(key: String!)是什么意思? 运营商名称是否正确: ?. :安全的呼叫运营商 ?: :猫王操作员 !! :确定运营商 ?:运算符和?.let之间有什么区别? 我应该什么时候使用每一个?