You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Java中‘Illegal start of expression’编译错误

解决你的日历代码编译错误与功能完善指南

首先咱先搞定你眼前的编译错误:你报错里的 else if(year%4!==0) 是JavaScript的不等于写法,Java里判断不等于要用 !=,不是 !==,这是第一个要改的地方。

然后咱梳理下代码里其他的问题,这些问题不仅会导致逻辑错误,还离你要的预期输出差不少:

一、编译与逻辑错误修复

  1. 语法错误修正

    • 把 year%4!==0 改成 year%4!=0
    • 代码里有个 month = 10,这是赋值操作,不是判断相等,得改成 month ==10
    • 你重复判断了 month ==12,前面的分支已经包含了12月,后面的分支里又出现,会导致逻辑混乱,得删掉重复的
  2. 日期验证逻辑优化

    • 你现在的二月判断是在单独的else if(month==2)里,但前面的分支已经有month==2的判断了,这会导致这个分支永远不会被执行,得重新梳理月份判断的结构:先判断大月(31天),再判断小月(30天,除了二月),最后单独处理二月
    • 日期判断里的else if(day >=31)这种逻辑有问题,比如day是32的话才会触发,但其实只要day>31就无效,应该改成else if(day>31),同理30天和28/29天的判断也是

二、补充预期输出需要的功能

你的预期输出里需要日期有效性提示、星期计算、周数计算、月份日历生成,这些功能现在的代码都没有,咱一步步加上:

1. 星期计算

可以用java.util.Calendar类来获取指定日期的星期(注意Calendar的星期是周日为1,周一为2...周六为7,需要转换为SUN MON...SAT的格式)

2. 周数计算

同样用Calendar的get(Calendar.WEEK_OF_MONTH)方法获取月份内的周数

3. 月份日历生成

需要获取指定月份的第一天是星期几,然后按格式打印日历,补全前面的空格,再逐行打印日期

修复并完善后的完整代码

import java.util.Calendar;
import java.util.Scanner;

public class MyCalendar {
    int day, month, year;
    boolean isDateValid = true;

    public MyCalendar(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
        validateDate();
    }

    // 日期验证逻辑
    private void validateDate() {
        // 月份范围验证
        if (month < 1 || month > 12) {
            isDateValid = false;
            return;
        }

        // 大月(31天)判断
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            isDateValid = (day >= 1 && day <= 31);
        }
        // 小月(30天)判断
        else if (month == 4 || month == 6 || month == 9 || month == 11) {
            isDateValid = (day >= 1 && day <= 30);
        }
        // 二月处理
        else if (month == 2) {
            // 闰年判断:能被4整除但不能被100整除,或者能被400整除
            boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
            if (isLeapYear) {
                isDateValid = (day >= 1 && day <= 29);
            } else {
                isDateValid = (day >= 1 && day <= 28);
            }
        }
    }

    // 输出日期有效性提示
    void checkAndPrintValidity() {
        String dateStr = day + "/" + String.format("%02d", month) + "/" + year;
        if (isDateValid) {
            System.out.println(dateStr + " is a valid date");
        } else {
            System.out.println(dateStr + " is not a valid date, please re-input a valid date:");
        }
    }

    // 获取日期对应的星期
    String getDayOfWeek() {
        if (!isDateValid) return "";
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, day); // Calendar月份从0开始
        int weekDay = cal.get(Calendar.DAY_OF_WEEK);
        switch (weekDay) {
            case Calendar.SUNDAY: return "SUNDAY";
            case Calendar.MONDAY: return "MONDAY";
            case Calendar.TUESDAY: return "TUESDAY";
            case Calendar.WEDNESDAY: return "WEDNESDAY";
            case Calendar.THURSDAY: return "THURSDAY";
            case Calendar.FRIDAY: return "FRIDAY";
            case Calendar.SATURDAY: return "SATURDAY";
            default: return "";
        }
    }

    // 获取日期在月份中的周数
    int getWeekOfMonth() {
        if (!isDateValid) return 0;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, day);
        return cal.get(Calendar.WEEK_OF_MONTH);
    }

    // 打印指定月份的日历
    void printMonthCalendar() {
        if (!isDateValid) return;
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, 1);
        int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1=周日,2=周一...7=周六
        int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

        System.out.println("The calendar of " + getMonthName(month) + " " + year + " is:");
        System.out.println("SUN MON TUE WED THU FRI SAT");

        // 打印第一行的空格
        for (int i = 1; i < firstDayOfWeek; i++) {
            System.out.print("    ");
        }

        // 打印日期
        int dayCounter = 1;
        for (int i = firstDayOfWeek; i <= 7; i++) {
            System.out.printf("%3d ", dayCounter);
            dayCounter++;
        }
        System.out.println();

        while (dayCounter <= daysInMonth) {
            for (int i = 1; i <= 7 && dayCounter <= daysInMonth; i++) {
                System.out.printf("%3d ", dayCounter);
                dayCounter++;
            }
            System.out.println();
        }
    }

    // 获取月份名称
    private String getMonthName(int month) {
        switch (month) {
            case 1: return "January";
            case 2: return "February";
            case 3: return "March";
            case 4: return "April";
            case 5: return "May";
            case 6: return "June";
            case 7: return "July";
            case 8: return "August";
            case 9: return "September";
            case 10: return "October";
            case 11: return "November";
            case 12: return "December";
            default: return "";
        }
    }

    public int getDay() { return day; }
    public int getMonth() { return month; }
    public int getYear() { return year; }

    public static void main(String[] args) {
        // 测试无效日期
        MyCalendar d = new MyCalendar(29, 2, 2019);
        d.checkAndPrintValidity();

        // 模拟输入有效日期
        Scanner scanner = new Scanner(System.in);
        String inputDate = scanner.nextLine();
        String[] parts = inputDate.split("/");
        int day = Integer.parseInt(parts[0]);
        int month = Integer.parseInt(parts[1]);
        int year = Integer.parseInt(parts[2]);

        MyCalendar validDate = new MyCalendar(day, month, year);
        validDate.checkAndPrintValidity();
        if (validDate.isDateValid) {
            System.out.printf("%d/%02d/%d is a %s and located in the %dth week of %s %d\n",
                    validDate.getDay(), validDate.getMonth(), validDate.getYear(),
                    validDate.getDayOfWeek(), validDate.getWeekOfMonth(), validDate.getMonthName(validDate.getMonth()), validDate.getYear());
            validDate.printMonthCalendar();
        }
        scanner.close();
    }
}

代码说明

  1. 编译错误修复:把!==改成!=,修正了month =10的赋值错误
  2. 日期验证优化:重新梳理了月份判断逻辑,修正了闰年判断的完整逻辑(之前只判断了能被4整除,没考虑整百年的情况)
  3. 功能补充:新增了星期计算、周数计算、月份日历打印、月份名称转换,以及模拟用户重新输入的逻辑
  4. 格式优化:用String.format保证日期的两位格式,用printf保证日历的对齐格式

现在运行代码,输入25/05/2019就能得到你想要的预期输出啦。

内容的提问来源于stack exchange,提问作者IAmKyrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:49:45