如何检查日历对象中的空值



我使用日历API来比较日期,如下所示:

Date date = DateHelper.getDate(stringDate) This returns a date object
Calendar atPtmtCalendar = Calendar.getInstance(); 
if(date != null){
atPtmtCalendar.setTime(date)
}

问题是,我目前正在检查变量日期是否为空值,而不是在PmtCalendar,因为:

if(date != null){
Boolean isBefore = atPtmtCalendar.before(otherCalendarDate)
}

有没有什么方法可以通过使用atPtmtCalendar来检查空值?

tl;dr

不可以,您不能使用可能为null的引用变量本身来查看它是否为null。您必须从变量外部进行检查。

Objects                     // Handle utility class.
.requireNonNull( myDate )   // Throws exception if reference variable holds no reference, is null.
.toInstant()                // Convert from terrible legacy class `java.util.Date` to modern class `java.time.Instant`. 
.isBefore(                  // Compare one `Instant` object to another.
Instant.now()           // Capture the current moment as seen with an offset of zero hours-minutes-seconds from UTC.
)                           // Returns true or false.

避免使用传统日期时间类

CCD_ 1&Calendar类存在严重缺陷。几年前,JSR310中定义的现代java.time类取代了它们。

java.time.Instant

当交给java.util.Date对象时,立即转换为其替代对象java.time.Instant。使用添加到旧类中的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;

要进行比较,请调用任何Instant方法:equalsisBeforeisAfter

Null检查

至于检查null…如果对象引用(如Date0(为null,则不能调用任何用于检查null的方法。因此,您的问题"有没有任何方法可以通过使用atPtmtCalendar来检查空值?"毫无意义。因此,您的null检查必须与使用可能为null的变量分开。

为了便于阅读,我更愿意直接用调用Objects.nonNull来代替您的空检查。

if( null != myVar ) { … }              // Not my favorite.
if( Objects.nonNull( myVar ) ) { … }   // Preferred by me.

如果变量永远不应该为null,那么如果它确实为null,则抛出异常。要执行此操作,请调用Objects.requireNonNull。也可以在异常中传递错误消息的文本。

if( Objects.requireNonNull( myVar ) ) { … } 

如果null在您的特定场景中是合法值,那么您调用的方法应该返回一个Optional

Optional< Date > date = whatever.getDate() ;

然后,您的代码可以使用Optional上几种方便的方法中的任何一种来处理丢失有效负载的情况。

示例代码

把所有这些放在一起:

boolean isPastDate = 
Objects
.requireNonNull( myDate )
.toInstant()
.isBefore( 
Instant.now() 
) 
;

最新更新