EditText.getText() 可以为空吗?
Can EditText.getText() ever be null?
我将 TextInputLayout
与 TextInputEditText
和 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 的标准组件上,尽管 .
我将 TextInputLayout
与 TextInputEditText
和 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 的标准组件上,尽管