【问题标题】:Java Month Mapping ProgramJava 月份映射程序
【发布时间】:2026-02-06 11:40:01
【问题描述】:

嘿,伙计们,我应该编写一个 Java 代码,该代码能够将月份名称打印到相应的月份编号,反之亦然……如果输入无效,则程序应该只打印一条错误消息。其他要求是 switch 语句和用于确定输入类型的静态类方法布尔值。不幸的是,我不知道如何确定数据类型以及如何对字符串使用 switch 语句......这就是我到目前为止所做的,它适用于第一部分:

import java.util.Scanner;

public class MonthMapping{

public static boolean isMonthNumber(String month) {

    int monthnumber = Integer.parseInt(month);

    if((monthnumber >= 1) && (monthnumber <= 12)) {
        return true;
    }

    else {
        return false;
    }
}

public static void main(String [] args){

    Scanner sc = new Scanner(System.in);


    System.out.print("Enter month:  ");
    int month = sc.nextInt();

    String monthString;

    switch (month) {
        case 1:  monthString = "January";
                 break;
        case 2:  monthString = "February";
                 break;
        case 3:  monthString = "March";
                 break;
        case 4:  monthString = "April";
                 break;
        case 5:  monthString = "May";
                 break;
        case 6:  monthString = "June";
                 break;
        case 7:  monthString = "July";
                 break;
        case 8:  monthString = "August";
                 break;
        case 9:  monthString = "September";
                 break;
        case 10: monthString = "October";
                 break;
        case 11: monthString = "November";
                 break;
        case 12: monthString = "December";
                 break;
        default: monthString = "Invalid month";
                 break;
    }

    System.out.println(monthString);

    }


}

谁能给我第二部分的解决方案?或者至少有一些提示如何做到这一点?

【问题讨论】:

  • 开启字符串仅适用于 java 7+。

标签: java if-statement switch-statement boolean


【解决方案1】:

检查数据类型

您可以创建如下方法来检查输入类型是什么:

public static boolean isString(Object input){
    try{
        String str = (String) input;
        return true;
    }catch(ClassCastException ex){
        return false;
    }
}

考虑以下情况:

输入:false,输出:(会返回false)

输入:“一月”,输出:(将返回true)

输入:43,输出:(返回false)

返回 False 是因为强制转换不起作用,当抛出该异常时会抛出 ClassCastException 它被 catch 子句捕获,该子句捕获 Exception 类型的异常及其各自的子类,这就是返回 false 的原因。

当 Class Cast 成功时,与第二种情况一样返回 true。


使用字符串切换语句

switch 语句的使用方式与您已经使用过的类似,但是数据类型已更改为...字符串,正如您所假设的那样。

switch(/*Enter String to be tested*/){

case /*String 1*/: //Logic if String to be tested is equal to logic 1.
                   //Optional break statements.
case /*String 2*/: //Logic if String to be tested is equal to logic 2.
                   //Optional break statements.
default: //Logic if the String to be tested is not equal to any of the case strings.

【讨论】:

    【解决方案2】:

    我知道您可能正在做作业或练习编码,就这样吧。但是你应该知道这个确切的行为已经内置在java.time 类中。

    java.time.Month

    在这些类中有 Monthenum,定义了十几个对象,一个对应一年中的每个月,1-12 月,编号为 1-12。

    获取特定月份编号 (1-12) 的 Month 对象。

    Month month = Month.of( 2 );  // 2 → February.
    

    换个方向,向Month 对象询问其月份编号。

    int monthNumber = Month.FEBRUARY.getValue();  // February → 2.
    

    这个类还有很多其他方便的方法,比如知道the number of days in each month。班级甚至可以generate a localized name当月。

    此外,您应该在代码库周围传递此枚举的对象,而不仅仅是整数。这样做可以提供类型安全,确保值的有效范围,并使您的代码更具自我记录性。如果不熟悉 Java 中令人惊讶的强大枚举功能,请参阅 Oracle Tutorial

    您还可能会发现 YearYearMonth 类很有用。


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】: