EditText.getText()可以为空吗?

问题描述 投票:2回答:2

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

就我个人而言,即使TextInputEditText为空,我也从未有过NPE这样做。

[我记得阅读过,返回值只能在创建视图或类似的地方时为null

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

android nullpointerexception android-edittext
2个回答
1
投票

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

编辑

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


1
投票

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

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

mText is marked as nullable,但通过代码查看,没有任何内容将其设置为null,并且构造函数mText确保返回之前不是checks it。但是,它标记为null,这意味着至少第三方代码可以通过反射来访问它。

关于某些其他提示(如果有可能发生这种情况,我们可以查看@UnsupportedAppUsage中的其他用法以查看这是否为有效状态)。像TextView等方法调用length()上的方法时不进行空检查,因此,如果构造函数返回后该方法为空,那么您将看到崩溃。

但是,我们也需要查看length(),因为mText EditText。那里有一条评论,向我们提供了我们需要的提示:

EditText

否则该方法将通过各种方式返回overrides getText()的结果,因此我们上面的分析适用:否则不能为null。

还有一个地方要检查:getText()是否覆盖 // This can only happen during construction. if (text == null) { ?没有。

因此简短的答案是:不,除非您有一个奇怪的子类,或者在构造过程中要调用它(除非您自己对它进行了子类化,否则这是可能的)。从技术上讲,它不是强制性的,但实际上它不应使用Google的标准组件来实现。

© www.soinside.com 2019 - 2024. All rights reserved.