繁体   English   中英

我是否必须检查String对象是否为null?

[英]Do I have to check whether a String object is null?

如果编译器将抱怨String对象未初始化,那么是否适合在我的方法中检查String对象是否为null?

有没有地方编译器不会为我检查?

这里有两个问题-标题中的一个和您似乎要问的一个。

初始化

编译器在抱怨“初始化”,而不是它是否为null。

初始化只是为您提供了一个值-通过将其设置为指向特定的String对象,或将其显式设置为null。

在初始化之前,变量的值是未知的...概括地说,它是最后使用它的东西恰好留在该内存地址中的任何值。

但是,您不必担心在运行时检查初始化-编译器不会让您陷入麻烦。

空引用检查

您的标题问题“我是否必须检查String对象是否为null?” 但是是一个稍微不同的问题您必须在运行时考虑。

有三种处理空引用的方法。

  1. 检查逻辑中的引用是否不为空(例如,在if语句中)
  2. 将支票置为断言
  3. 将代码放入带有明确捕获java.lang.NullPointerException的try / catch块中
  4. 完全忽略这个问题

最后一个选项只是意味着,如果使用null,则异常将一直运行到代码中线程的入口点并终止线程。

因此,明智的做法是在代码的每个线程入口点周围放置一个全局陷阱,该陷阱至少报告了未处理的异常发生了,并提供了大量的信息来帮助您确定发生了什么(可能在终止执行之前)。处于计划外和意外状态的应用程序)。

您实际上要选择上述哪个选项,取决于该点是否存在空指针。 如果引用是在当前类中创建和管理的,并且您知道它不可能为null,那么选项4是有效的。

相反,如果您正在创建其他开发人员(可能在控件之外)可能会调用的通用代码,尤其是在null可能对对象产生长期不利影响的地方(例如,您可以使用它来设置只会破坏代码很多的东西)稍后),那么选项1是值得的。

如果您希望能够在测试后将其关闭,并且还希望在代码中明确指出测试不是算法的一部分,而只是一种安全措施,则选项2很有用

选项3很少见,但是如果您传递了很多变量,而这些问题的可能性很小,则可以使用选项3,但是如果它们是变量,那么问题将在调用期间显现出来。

在Java中,如果不显式初始化成员变量,则成员变量会自动初始化为null

但是,局部变量不会自动初始化为null ,因此,如果您在尝试使用局部变量之前未对其进行初始化,则编译器会向您显示错误消息(“变量可能尚未初始化”)。 在这种情况下,仅检查null是不够的。 您必须先初始化变量,然后才能使用它。

是的,只要值可能为null ,就应该检查这种可能性。 但是,请记住,在可以将代码初始化为非空值之前,几乎总是可以将代码重构为不声明变量,这样做通常会更健壮。 换句话说,如果变量在相当长的时间内为null ,那么这是一个好兆头,您目前并不需要在范围内。

您可以检查是否认为该值的来源可能会提供一个空值。 例如,如果您的API使用者可能是新手,那么您可能要检查一下他们是否没有将null传递给您。 为此,除非别人告诉您他们接受它并且您有充分的理由,否则请不要将null传递给其他人,并尽量不要返回null。

您应始终检查您正在使用的任何对象是否具有所需/有效值。

如果仍然有可能引用字符串变量,则可以进行检查。 否则,如果只是被编译器消息烦恼(并且不担心使用空引用),则可以在声明变量为= null时显式初始化变量,或者分配空字符串值(此选项将占用一些内存空间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM