标签: kotlin-null-safety

为什么不安全的.run()调用在Kotlin中的空值上工作正常?

我有以下代码片段:

val foo: String? = null
foo.run { println("foo") }
Run Code Online (Sandbox Code Playgroud)

我这里有一个可以为空的变量foo,实际上设置null为非安全.run()调用.

当我运行代码片段时,foo尽管run在a上调用了该方法,但我仍然打印出来null.这是为什么?为什么不NullPointerException呢?为什么编译器允许对可选值进行非安全调用?

如果我通过println(foo),我得到一个不错的多汁null的控制台,所以我认为它是安全的假设,foo实际上是null.

kotlin kotlin-null-safety

6
推荐指数
1
解决办法
1253
查看次数

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

我有一个案例,其中Java to 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
});
Run Code Online (Sandbox Code Playgroud)

将此代码粘贴到Kotlin结果:

registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {}

    override fun onActivityStarted(activity: Activity) {}

    override fun onActivityResumed(activity: Activity) {}

    override fun onActivityPaused(activity: Activity) {}

    // ... other overriden methods (all with non-nullable parameters)
})
Run Code Online (Sandbox Code Playgroud)

问题是savedInstanceState参数类型Bundle应该是Bundle?它的位置,因为它的值可以是null …

java android kotlin kotlin-android-extensions kotlin-null-safety

6
推荐指数
1
解决办法
972
查看次数

这个 Kotlin 类型是什么:(String..String?)

IntelliJ 向我显示上下文提示,表明我的变量的类型为(String..String?)。我在互联网上找不到任何提及,这是什么类型?

在此输入图像描述

syntax types nullable kotlin kotlin-null-safety

6
推荐指数
1
解决办法
1196
查看次数

kotlin反射检查可空类型

如何测试KType变量是否包含可为空的kotlin类型的值(eG Int?)?

我有

var type: KType 
Run Code Online (Sandbox Code Playgroud)

变量来自a KProperty<*>.returnType,我需要检测它是否等于某些kotlin类型(Int,Long等).这适用于:

when (type) {
    Int::class.defaultType -> ...
    Long::class.defaultType -> ...
    else -> ...
}
Run Code Online (Sandbox Code Playgroud)

但这仅适用于非可空类型,因此第一个分支与Int不匹配?但是我还是无法弄清楚我是如何检测到的类型是Int?除了明显但不那么好

type.toString().equals("kotlin.Int?")
Run Code Online (Sandbox Code Playgroud)

reflection nullable kotlin kotlin-null-safety

5
推荐指数
1
解决办法
1329
查看次数

Kotlin可空变量赋值

在Kotlin中,此代码的语法是否更短:

if(swipeView == null){
     swipeView = view.find<MeasureTypePieChart>(R.id.swipeableView)
}
Run Code Online (Sandbox Code Playgroud)

首先我试过这个:

 swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView)
Run Code Online (Sandbox Code Playgroud)

但后来我意识到这不是一个任务,所以代码什么都不做.然后我试过:

swipeView = swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView)
Run Code Online (Sandbox Code Playgroud)

哪个有效,但有点冗长.我希望这样的事情:

swipeView ?= view.find<MeasureTypePieChart>
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这不起作用.有没有办法用短语法完成这个?

我知道我可以这样做:

variable?.let { it = something } which works.
Run Code Online (Sandbox Code Playgroud)

shortcut variable-assignment kotlin kotlin-null-safety

5
推荐指数
1
解决办法
437
查看次数

Kotlin对null的非null断言

由于Kotlin有非空的断言,我发现了一些有趣的东西......

val myvar: String = null!!
Run Code Online (Sandbox Code Playgroud)

它会崩溃.

但重点是,它不会在编译时检查.

该应用程序将在运行时崩溃.

它不应该抛出编译时错误吗?

null android kotlin android-studio kotlin-null-safety

5
推荐指数
1
解决办法
931
查看次数

如何使用 Kotlin 中的默认构造函数参数值实例化对象?

我有默认值的数据类。

data class Project(
    val code: String,
    val name: String,
    val categories: List<String> = emptyList())
Run Code Online (Sandbox Code Playgroud)

当某些值为空时,Java 反射无法实例化类。我得到了例外

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories
Run Code Online (Sandbox Code Playgroud)

这是因为java.lang.reflect.Constructor<T>.instantiateClass方法需要不为空的参数。

我有类型信息,我有构造函数定义,但我不确定如何调用构造函数以便它使用默认值(这些值来自数据库并且categories可以是null)。有没有办法在 Kotlin 中实现这一目标?

reflection kotlin kotlin-reflect kotlin-null-safety

5
推荐指数
2
解决办法
1514
查看次数

有没有办法从范围创建一个非null数组?

在Java中,可以使用传统的for循环创建一个简单的数组:

ImageButton[] buttons = new ImageButton[count];

for (int i = 0; i < count; i++) {
   buttons[i] = view.findViewById(BUTTON_IDS[i]);
}
Run Code Online (Sandbox Code Playgroud)

简单转换为Kotlin会产生以下结果:

val buttons = arrayOfNulls<ImageButton>(count)

for (i in 0..count) {
    buttons[i] = view.findViewById<ImageButton>(BUTTON_IDS[i])
}
Run Code Online (Sandbox Code Playgroud)

这个问题是现在数组中的每个元素都是可选的; 这让?操作员摆脱了我的代码.

有没有办法以类似的方式创建数组,但没有可选类型?

arrays kotlin kotlin-null-safety

5
推荐指数
1
解决办法
693
查看次数

聪明地施放到kotlin.String

我正在尝试Kotlin并从编译器获得消息:

Smart cast to kotlin.String
Run Code Online (Sandbox Code Playgroud)

码:

/*"mTripStatus" is a nullable String*/
var html :String = HTML
html = if (mTripStatus!=null) html.replace("TRIP_STATUS_VALUE", mTripStatus) else html
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

android compiler-warnings kotlin kotlin-null-safety

5
推荐指数
1
解决办法
2292
查看次数

Android Room返回Null作为Non-Null类型

我必须Dao返回简单的对象。如果对象不存在,则Room返回null,但是Android应用程序没有崩溃。另外,如果我将该值分配给非null变量,则应用程序中不会发生崩溃。

道:

@Query("SELECT * FROM users WHERE id LIKE :id LIMIT 1")
abstract fun getById(id: Long): User
Run Code Online (Sandbox Code Playgroud)

不崩溃的代码:

doAsync {
    val user: User = userDao.getById(999)   // user 999 not exist, userDao returns null
    uiThread {
        if (user == null) {
            Timber.d("user is $user")   // "user is null" in log
        } else {
            Timber.d("user is ${user.email}")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. Room如何将Null值作为Non-Null变量返回?
  2. 将null分配给Non-Null变量的代码如何不会崩溃

crash android kotlin android-room kotlin-null-safety

5
推荐指数
2
解决办法
793
查看次数