如果编译器要抱怨String对象没有初始化,那么检查我的方法是否适合String对象是否为空?
有没有编译器不会为我检查的地方?
答案 0 :(得分:6)
这里有两个问题 - 标题中的一个问题和你似乎要问的问题。
编译器抱怨“初始化”而不是它是否为空。
初始化只是你给它一个值 - 通过将其设置为指向特定的String对象或通过明确地将其设置为null。
在初始化之前,变量的值是未知的......粗略地说,它是在最后一个使用它的内存地址中留下的任何值。
但是,您不必担心在运行时检查初始化 - 编译器不会让您达到问题的地步。
您的标题问题是“我是否必须检查String对象是否为空?”然而,这是一个稍微不同的问题, 你必须在运行时考虑。
有三种方法可以处理空引用。
最后一个选项只是意味着如果使用null,则异常将一直运行回到代码中的线程入口点并终止线程。
正因为如此,总是明智的做法是在代码的每个线程入口点周围设置一个全局捕获 - 一个至少报告发生了未处理的异常并提供大量信息以帮助您解决发生的事情(可能在终止应用程序之前,因为它处于计划外和意外状态。)
您所做的上述选项中的哪一个实际上取决于该点处存在空指针的可能性。如果引用是在当前类中创建和管理的,并且您知道它“无法”为null,则选项4有效。
相反,如果您正在创建其他开发人员(可能在您的控件之外)可能调用的通用代码,特别是null可能会对您的对象产生长期不利影响(例如,您可以使用它来设置只会破坏的东西)你的代码很晚了)然后选项1值得。
如果您希望能够在测试后将其关闭,并且在代码中明确表示测试不是算法的一部分,那么选项2非常有用,只是一个安全措施
选项3很少见,但是如果你传递了很多变量并且很有可能它们成为一个问题,那么可以使用它,但是如果它们是,那么问题将在通话期间显现出来。
答案 1 :(得分:2)
在Java中,如果您没有明确初始化成员变量,则成员变量会自动初始化为null
。
然而,局部变量不会自动初始化为null
,因此如果在尝试使用它之前未初始化局部变量,编译器将给出错误消息(“变量可能尚未初始化” )。在这种情况下,仅检查null
是不够的。您必须在使用之前初始化变量。
答案 2 :(得分:0)
是的,只要值可能为null
,您就应该检查这种可能性。但是,您应该记住,在您准备将其初始化为非null值之前,代码几乎总是可以重构为不声明变量,并且它通常会更加健壮。换句话说,如果变量是null
很长一段时间,那么这是一个好兆头,你现在并不需要它在范围内。
答案 3 :(得分:0)
您可以检查您是否认为该值的来源可能为空值。例如,如果您的API的消费者可能是新手,您可能想要检查他们没有通过您null。为此,尽量不要将null传递给其他人,除非他们告诉你他们接受它并且你有充分的理由,并且尽量不返回null。
答案 4 :(得分:0)
您应该始终检查您使用的任何对象是否具有所需/有效值。
如果您的字符串变量仍然为空时有可能引用它,是的,请进行检查。否则,如果您只是厌倦了编译器消息(并且不担心空引用),则可以在声明为null时显式初始化变量,或者指定空字符串值(此选项将占用一些内存空间) )。