Java日历程序日期对齐错误及getStartDay符号找不到问题排查
一、解决「cannot find symbol」错误
你提供的代码中getStartDay方法定义在printMonthBody方法之后,Java编译器处理printMonthBody时还未识别到该方法,因此报错。有两种解决方式:
- 将
getStartDay方法移动到printMonthBody方法之前; - 在
printMonthBody方法前提前声明方法签名:static int getStartDay(int year, int month);
二、解决日期对齐问题
当前日期输出未固定宽度,单数字与双数字日期占用字符数不一致,导致排版混乱。改用printf格式化输出,固定每个日期的占位宽度即可实现对齐:
修改printMonthBody方法的两处逻辑:
- 调整前置空格循环,每个星期列对应4个字符宽度:
for (i = 0; i < startDay; i++) { System.out.print(" "); // 4个空格匹配日期宽度 }
- 替换日期输出逻辑,用格式化输出固定宽度:
for (i = 1; i <= numberOfDaysInMonth; i++) { System.out.printf("%4d", i); // 每个日期占4个字符,右对齐 if ((i + startDay) % 7 == 0) { System.out.println(); } }
修正后的完整代码
import java.util.Scanner; public class PrintCalendar3 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter full year (e.g., 2016): "); int year = scanner.nextInt(); System.out.print("Enter month in number between 1 and 12: "); int month = scanner.nextInt(); printMonth(year, month); } static void printMonth(int year, int month) { printMonthTitle(year, month); printMonthBody(year, month); } static void printMonthTitle(int year, int month) { System.out.println(" " + getMonthName(month) + " " + year); System.out.println("-----------------------------"); System.out.println(" Sun Mon Tue Wed Thu Fri Sat"); } static String getMonthName(int month) { String monthName = null; switch (month) { case 1: monthName = "January"; break; case 2: monthName = "February"; break; case 3: monthName = "March"; break; case 4: monthName = "April"; break; case 5: monthName = "May"; break; case 6: monthName = "June"; break; case 7: monthName = "July"; break; case 8: monthName = "August"; break; case 9: monthName = "September"; break; case 10: monthName = "October"; break; case 11: monthName = "November"; break; case 12: monthName = "December"; } return monthName; } // 提前声明方法签名 static int getStartDay(int year, int month); static void printMonthBody(int year, int month) { int startDay = getStartDay(year, month); int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month); int i = 0; for (i = 0; i < startDay; i++) { System.out.print(" "); } for (i = 1; i <= numberOfDaysInMonth; i++) { System.out.printf("%4d", i); if ((i + startDay) % 7 == 0) { System.out.println(); } } System.out.println(); } static int getStartDay(int year, int month) { int startDay1800 = 3; int totalNumberOfDays = getTotalNumberOfDays(year, month); return (totalNumberOfDays + startDay1800) % 7; } static int getTotalNumberOfDays(int year, int month) { int total = 0; for (int i = 1800; i < year; i++) { total += isLeapYear(i) ? 366 : 365; } for (int i = 1; i < month; i++) { total += getNumberOfDaysInMonth(year, i); } return total; } static int getNumberOfDaysInMonth(int year, int month) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { return 31; } else if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; } else if (month == 2) { return isLeapYear(year) ? 29 : 28; } return 0; } static boolean isLeapYear(int year) { return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); } }
运行修正后的代码,日期会整齐对齐,同时方法找不到的错误也会解决。
内容的提问来源于stack exchange,提问作者Nicole
相关产品推荐
相关产品推荐

