如果编译器会提示 String 对象未初始化,那么在我的方法中检查 String 对象是否为 null 是否合适?
有没有编译器不会为我检查的地方?
最佳答案
这里有两个问题 - 标题中的一个和您似乎要问的那个。
初始化
编译器提示的是“初始化”,而不是它是否为 null。
初始化只是您给了它一个值 - 通过将其设置为指向特定的 String 对象或明确地将其设置为 null。
在初始化之前,变量的值是未知的...粗略地说,它是最后一个使用它的东西恰好留在该内存地址中的任何值。
但是您不必担心在运行时检查初始化 - 编译器不会让您到达问题所在的地步。
空引用检查
您的标题问题“我是否必须检查 String 对象是否为空?”然而这是一个略有不同的问题,您必须在运行时考虑。
存在三种处理空引用的方法。
- 检查引用在您的逻辑中是否为空(即在 if 语句中)
- 将检查放在断言中
- 将代码放在 try/catch block 中,并明确捕获 java.lang.NullPointerException
- 完全忽略这个问题
最后一个选项只是意味着,如果使用 null,则异常将一直运行到线程的入口点,进入您的代码并终止线程。
正因为如此,在您的代码的每个线程入口点周围放置一个全局捕获总是明智的 - 一个至少报告发生了未处理的异常并提供大量信息以帮助您找出发生了什么(可能是在终止应用程序之前,因为它处于计划外和意外状态)。
您执行上述哪些选项实际上取决于此时存在空指针的可能性。如果引用是在当前类中创建和管理的,并且您知道它“不可能”为空,则选项 4 有效。
相反,如果您正在创建其他开发人员(可能在您的控制范围之外)可能会调用的通用代码,特别是在 null 可能对您的对象产生长期不利影响的地方(例如,您可以使用它来设置只会破坏的东西你的代码要晚得多)那么选项 1 是值得的。
如果您希望能够在测试后将其关闭并在代码中明确表示测试不是算法的一部分,只是一种安全措施,则选项 2 很有用
选项 3 很少见,但如果您传入大量变量且它们成为问题的可能性很小,则可以使用选项 3,但如果是,那么问题将在调用期间显现。
关于java - 我是否必须检查 String 对象是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796148/