try catch返回null

cedebl8k  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(437)

我是java新手,我正在努力使这段代码正常运行。如果我第一次输入的出生日期错误,程序将返回null,如果我从第一次输入正确的出生日期起,程序将返回正确的出生日期。我做错了什么?

public static Date convertDOB() //Date of Birth Method
{
    System.out.println("Enter Date Of Birth: ");
    String dob = in.nextLine();
    SimpleDateFormat formater = new SimpleDateFormat("dd/MM/yyyy");
    Date realdob = null;
    try
    {
        realdob = formater.parse(dob);
    }
    catch(ParseException e)
    {
        System.out.println("In-correct format. Format should be dd/mm/yyyy");
        convertDOB();
    }
    return realdob;
    }
unftdfkk

unftdfkk1#

java.time文件

我强烈建议您在日期工作中使用java.time,这是一种现代的java日期和时间api。对于从用户处读取日期,我建议使用迭代方法,而不是递归方法:

static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/u");

public static LocalDate convertDob() // Date of birth method
{
    LocalDate realdob = null;
    do {
        System.out.println("Enter date of birth:");
        String dob = in.nextLine();
        try {
            realdob = LocalDate.parse(dob, formatter);
        } catch (DateTimeParseException e) {
            System.out.println("In-correct format. Format should be dd/mm/yyyy");
        } 
    } while (realdob == null);
    return realdob;
}

互动示例:

Enter date of birth:
3208/1932
In-correct format. Format should be dd/mm/yyyy
Enter date of birth:
23/08/1932

循环条件 realdob == null 确保方法永远不会返回 null . 在格式模式字符串中,我只给出一个 d 还有一个 M 以便用户可以自由输入一位或两位数字。许多用户觉得这很方便。如果您坚持要求用户输入两位数字表示月份和月份,请使用pattern dd/MM/uuuu .
如果您喜欢递归解决方案:

public static LocalDate convertDob() // Date of birth method
{
    LocalDate realdob = null;
    System.out.println("Enter date of birth:");
    String dob = in.nextLine();
    try
    {
        realdob = LocalDate.parse(dob, formatter);
    }
    catch(DateTimeParseException e)
    {
        System.out.println("In-correct format. Format should be dd/mm/yyyy");
        realdob = convertDob();
    }
    return realdob;
}

与代码相比的技巧是将递归调用返回的值赋给 realdob 所以它会被返回(也从这个调用中)。

链接

oracle教程:date time解释如何使用java.time。

zbsbpyhn

zbsbpyhn2#

在每次递归调用期间,您都要初始化date类型的新对象。因此,即使在方法的后续递归调用中,如果存在正确的dob,方法的第一个调用总是返回null,因为这是初始化的。相反,在catch块中返回从下一个调用中得到的dob-

public static Date convertDOB() //Date of Birth Method
   {
    System.out.println("Enter Date Of Birth: ");
    String dob = in.nextLine();
    SimpleDateFormat formater = new SimpleDateFormat("dd/MM/yyyy");
    Date realdob = null;
    try
    {
        realdob = formater.parse(dob);
    }
    catch(ParseException e)
    {
        System.out.println("In-correct format. Format should be dd/mm/yyyy");
        return convertDOB();
    }
    return realdob;
    }
bxgwgixi

bxgwgixi3#

当你第一次输入错误的出生日期时,你就会陷入困境。在那里,你执行 convertDOB() ,但您不返回它:第一个 realdob 为空。
一旦第二个convertdob()完成,它将继续 return realdob; ,从上面看,为空。有两种方法可以解决此问题:
1.

catch(ParseException e)
{
    System.out.println("In-correct format. Format should be dd/mm/yyyy");
    return convertDOB();
}

您可以返回convertdob在第二次执行函数时返回的任何内容。
2.

catch(ParseException e)
{
    System.out.println("In-correct format. Format should be dd/mm/yyyy");
    realdob = convertDOB();
}
return realdob;

你设置了第二个 convertDOB() 执行,然后返回它。

相关问题