java - 如何处理无效输入

标签 java

任何人都可以建议一个有关如何处理无效输入的示例,我从键盘输入的逻辑错误。因此,我需要 !myScanner.hasNextInt() 或将该循环放入我可以永远重用的方法中。

package dayoftheyear;

import java.util.Scanner;

/**
 *
 * @author abdal
 */
public class DayOfTheYear {

    /**
     * Ask the user to enter a month, day, and year as integers
     * separated by spaces then display the number of the days since the
     * beginning of the year.
     * Don’t forget about leap year.
     * Sample: user inputs ‘3 1 2000’, output is ‘61’.
     * @param args Unused.
     */
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String enter = "A-z";
        int a=31;
        int b=1;


        boolean dateCheck;
        int month;
        int day;
        int year;

        do {
            System.out.print("Enter a valid month day year separated by spaces");
            if (s.hasNextInt()) {
                month= s.nextInt();
                day=s.nextInt();
                year=s.nextInt();
                if (month >= b && month <= a || day>=b && day<=a || year>=b) {
                    int numberOfDay = countDays(month, day, year);
                    System.out.println(+ month + "/" + day + "/" + year + " is a day number " 
                                + numberOfDay + " of that year");
                    dateCheck = true;
                } else {
                    System.out.println("Enter a valid month day year separated by spaces");
                    dateCheck = false;
                }
            } else {
                System.out.println("Not a date");
                month = 0;
                day=0;
                year=0;
                s.next();
                dateCheck = false;
            }
        } while (!dateCheck);

    /**
     * Get the number of days since the start of the year.
     * Declare a 12 element array and initialize it with the number of
     * days in each month.
     * @param month Month to count from.
     * @param day Day of the month to count to.
     * @param year The year to count from.
     * @return Days since the start of the given year.
     */
    } public static int countDays(int month, int day, int year) {
        int monthLength[] = {
            31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
        };
        int days = 0;
        if (isLeapYear(year) && month > 2) 
            days += 1;
        for (int i = 0; i < month - 1; i++) 
            days += monthLength[i];
        return days += day;
    }

    /**
     * Check if a year is a leap year.
     * @param year Year to check.
     * @return True if the year is a leap year.
     */

        public static boolean isLeapYear(int year) {
            if (year % 4 != 0) return false;
            else if (year % 100 != 0) return true;
            else return year % 400 == 0;
    }   
}

最佳答案

替换

if (month >= b && month <= a || day>=b && day<=a || year>=b)

if (month >= 1 && month <= 12 && day >= 1 && day <= 31 && year >= 1)

此更改后运行的示例:

Enter a valid month day year separated by spaces: 13 1 2000
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 3 32 2000
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 3 1 2
3/1/2 is a day number 60 of that year

更新1:以下条件也适用于二月

if ((month == 2 && day >= 1 && day <= 28 && year >= 1 && !isLeapYear(year))
        || (month == 2 && day >= 1 && day <= 29 && year >= 1 && isLeapYear(year))
        || (month != 2 && month >= 1 && month <= 12 && day >= 1 && day <= 31 && year >= 1)) 

示例运行:

Enter a valid month day year separated by spaces: 2 29 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 13 2 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 1 32 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 1 2 3
1/2/3 is a day number 2 of that year

更新2:以下代码解决了评论中提出的所有问题

int monthLength[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((month == 2 && day >= 1 && day <= 28 && year >= 1 && !isLeapYear(year))
        || (month == 2 && day >= 1 && day <= 29 && year >= 1 && isLeapYear(year))
        || (month != 2 && month >= 1 && month <= 12 && day >= 1 && day <= monthLength[month-1] && year >= 1))

示例运行:

Enter a valid month day year separated by spaces: 2 29 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 13 2 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 1 32 2001
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 6 31 2020
Enter a valid month day year separated by spaces
Enter a valid month day year separated by spaces: 7 31 2020
7/31/2020 is a day number 213 of that year

关于java - 如何处理无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076265/

相关文章:

java - 如何确定哪个类正在通过 System.out 发送消息

java - 使用Spock和Robospock进行单元测试以创建SQLite数据库

java - N 秒内对 M 个请求的限制方法调用

java - 未找到 HTTP/1.1 404 - JSON Spring MVC

java - Sonarqube 从 6.0 升级到 6.4 时没有语言插件错误

java - Spring中json中的斜杠是什么

java - 如何使用 selenium webdriver 执行复制/粘贴

java - 循环中分数的加法

java - 在 Android 手机上计算圆周率

java - 如何获取组类型数据库中其他用户的Uid?