EditText.getText() 可以为空吗?

Can EditText.getText() ever be null?

我将 TextInputLayoutTextInputEditText 和 Android 一起使用 Lint 总是警告我在 getText() 上调用 toString() 可能会产生 NullPointerException .

就个人而言,我从来没有让 NPE 这样做过,即使 TextInputEditText 是空的。

我记得读过 return 值只能在创建视图或某处类似内容时 null

简单地忽略 Lint 警告是否安全,还是我应该检查 null 以防万一?

Editable 是一个 interface。您使用的 interface 的实现可能不能是 null,但即使我们实际上知道在您的用例中不处理 NPE 是安全的,我还是建议不要这样做。可能有正在使用的该接口的实现可能具有 null 作为值。如果问题是你一遍又一遍地重复这个问题,你可以实现一个 util 方法来解决这个问题。

编辑

正如 Ryan M 在评论部分指出的和文档确认的那样,Editable 没有 getText 方法,但是,这不会改变分离我们关注点的一般想法。

要回答这个问题,我们可以看看源码。

TextView.getText(),超类方法,是pretty straightforward:它returns mText.

mText is marked as nullable, but looking through the code, nothing sets it to null, and the constructor checks it 以确保在返回之前它不是 null。不过,它被标记为 @UnsupportedAppUsage,这意味着至少第三方代码可以通过反射访问它。

对于一些额外的提示,如果这是可能发生的事情,我们可以查看 TextView 中的其他用法,看看这是否是一个有效的状态。 length() 等方法和其他方法调用 mText 上的方法而不进行 null 检查,因此如果在构造函数 returns 之后它为 null,您将看到崩溃。

但是,我们还需要看一下EditText,因为EditText overrides getText()。那里有一条评论给了我们需要的提示:

        // This can only happen during construction.
        if (text == null) {

方法否则returns通过各种方式得到super.getText()的结果,所以我们上面的分析适用:否则它不能为null。

还有一个地方需要检查:TextInputEditText 是否会覆盖 getText()?它没有。

所以简短的回答是:不,除非你有一个奇怪的它的子类,或者你在构造过程中调用它(只有你自己将它子类化才有可能)。它在技术上没有强制执行,但它确实不应该发生在 Google 的标准组件上,尽管 .