我在我的项目中遇到了这行代码:
String statusRecoTime = sdf.format(cal.getTime());
然后有一个空检查,如
if (statusRecoTime != null) {
//do something
}
我认为它statusRecoTime
永远不会为空,也不需要这个检查,因为它被分配了一个对象。
请让我知道我的理解是否正确?
我在我的项目中遇到了这行代码:
String statusRecoTime = sdf.format(cal.getTime());
然后有一个空检查,如
if (statusRecoTime != null) {
//do something
}
我认为它statusRecoTime
永远不会为空,也不需要这个检查,因为它被分配了一个对象。
请让我知道我的理解是否正确?
从SimpleDateFormat 文档NullPointerException
中,如果传递的日期为空,则该方法返回 a :
SimpleDateFormat.format()
将给定的格式设置
Date
为日期/时间字符串,并将结果附加到给定的StringBuffer
.由y指定
format
:在类中DateFormat
参数:date
- 要格式化为日期时间字符串的日期时间值。
toAppendTo
- 要附加新的日期时间文本的位置。
pos
- 格式化位置。输入时:如果需要,对齐字段。输出时:对齐字段的偏移量。
返回:格式化的日期时间字符串。
抛出:NullPointerException
- 如果给定日期为空。
检查statusRecoTime != null
不是必需的,因为如果null
.
我假设sdf
是一个SimpleDateFormat
实例。
首先要检查的是文档,正如 Mistalis 已经在answer 中所做的那样。单参数format
方法在超类中声明,DateFormat
文档说
返回:
格式化的时间字符串。
这应该足够了。没有提到它可以返回null
,所以应该没有必要检查。我们可以在这里停下来。
如果您想更加确定,我们可以检查您使用的 Java 版本的源代码。在 Java 8 中(我希望在所有版本中)format(Date)
调用一个三参数format
方法,得到一个StringBuffer
返回并调用它的toString()
方法。StringBuffer.toString()
做一个new String()
. new
保证永不退货null
。所以现在我们可以确定了。
例外:一个邪恶的人可能会编写一个子类,SimpleDateFormat
其中format(Date)
返回null
的结果可能与文档冲突。您的sdf
变量可以包含这种邪恶子类的实例。你可以得到null
. 如果您从您的代码中知道sdf
它始终是一个SimpleDateFormat
而不是某个本土或第三方子类,我们可以排除这种可能性。
不,您在这里不需要任何空值检查,就好像sdf将无法格式化它会抛出错误而不是空值的时间。尽管如果您在sdf中定义了正确的格式,那么您正在格式化日历异常的时间也不会出现。
假设那sdf
是一个SimpleDateFormat
实例,format
将永远不会返回null
。null
检查是完全没有必要的。
这里的各种答案都与该代码是否会引发异常有关。唯一的情况是 ifsdf
或cal
were null
。但是假设两者都是 non-null
并且cal
是 a Calendar
,则该代码不会引发异常。