{"record":{"id":"ad6af5317cabf71f","repo":"chinabugotech/hutool","slug":"the-date-must-not-be-null","errorCode":null,"errorMessage":"The date must not be null","messagePattern":"The date must not be null","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java","lineNumber":372,"sourceCode":"\t * 修改某年的结束时间\n\t *\n\t * @param calendar 日期 {@link Calendar}\n\t * @return {@link Calendar}\n\t */\n\tpublic static Calendar endOfYear(Calendar calendar) {\n\t\treturn ceiling(calendar, DateField.YEAR);\n\t}\n\n\t/**\n\t * 比较两个日期是否为同一天\n\t *\n\t * @param cal1 日期1\n\t * @param cal2 日期2\n\t * @return 是否为同一天\n\t */\n\tpublic static boolean isSameDay(Calendar cal1, Calendar cal2) {\n\t\tif (cal1 == null || cal2 == null) {\n\t\t\tthrow new IllegalArgumentException(\"The date must not be null\");\n\t\t}\n\n\t\tif(ObjUtil.notEqual(cal1.getTimeZone(), cal2.getTimeZone())){\n\t\t\t// 统一时区\n\t\t\tcal2 = changeTimeZone(cal2, cal1.getTimeZone());\n\t\t}\n\n\t\treturn cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) && //\n\t\t\tcal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && //\n\t\t\tcal1.get(Calendar.ERA) == cal2.get(Calendar.ERA);\n\t}\n\n\t/**\n\t * 是否为本月最后一天\n\t *\n\t * @param calendar {@link Calendar}\n\t * @return 是否为本月最后一天\n\t * @since 5.8.27","sourceCodeStart":354,"sourceCodeEnd":390,"githubUrl":"https://github.com/chinabugotech/hutool/blob/8870454b2a0c29cc6ffd31dcf5667c8ceb2fc442/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java#L354-L390","documentation":"Thrown by CalendarUtil.isSameDay(Calendar, Calendar) when either cal1 or cal2 is null. The method requires two non-null Calendar instances to compare DAY_OF_YEAR, YEAR, and ERA fields. It does not treat null as 'unknown' — it is a hard precondition failure.","triggerScenarios":"Calling CalendarUtil.isSameDay(null, cal2) or isSameDay(cal1, null). Passing a Calendar obtained from a nullable source (e.g., a date field from a partially populated DTO or database row) without a null check.","commonSituations":"Comparing dates from optional database columns that can be null. Comparing user-supplied dates in a form where the user left a date field blank. Chain calls where an upstream method returns null Calendar on parse failure.","solutions":["Null-check both Calendar arguments before calling isSameDay: if (cal1 != null && cal2 != null) { ... }.","Default null calendars to a sentinel or 'now' with ObjectUtil.defaultIfNull(cal, Calendar.getInstance()) if business logic permits.","Use DateUtil.isSameDay(Date, Date) with Date objects if your inputs are dates, but still guard for null.","Wrap the call site in a utility method that returns false or Optional for null inputs."],"exampleFix":"// before\nboolean same = CalendarUtil.isSameDay(cal1, cal2); // throws if null\n\n// after\nboolean same = cal1 != null && cal2 != null && CalendarUtil.isSameDay(cal1, cal2);","handlingStrategy":"validation","validationCode":"if (cal1 == null || cal2 == null) {\n    return false; // or throw your own domain exception\n}\nCalendarUtil.isSameDay(cal1, cal2);","typeGuard":"static boolean isComparable(Calendar... cals) {\n    for (Calendar c : cals) { if (c == null) return false; }\n    return true;\n}","tryCatchPattern":null,"preventionTips":["Always null-check both Calendar arguments before calling isSameDay().","Create a null-safe wrapper utility for date comparisons.","Ensure upstream date parsing never returns null Calendar objects."],"tags":["date","calendar","null-check","comparison","argument-validation"],"backgroundTag":null,"analyzedSha":"8870454b2a0c29cc6ffd31dcf5667c8ceb2fc442","analyzedAt":"2026-08-14T04:01:12.892Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}