首页 > 解决方案 > 使用解析检查输入字符串日期是否在Java中,在调用方法时使用“抛出ParseException”

问题描述

我正在处理课程的信用卡验证部分,但我被困在如何检查卡是否已过期。

支付等级(部分):

public Payment(...,String date,...)
{
    ...
    sendEmail(order,this.billingAddress,remark);
}

public boolean checkExpiry(String inDate) throws ParseException
{
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    Date expiry=format.parse(inDate);
    Date today = new Date();
    if(today.before(expiry))
    {
        return true;
    }else{
        return false;
    }
}

public boolean isValid(String cardType,String cardNum,String date) throws ParseException
{
    if(cardType.equals("MasterCard") || cardType.equals("Visa")){
        if(cardNum.length()==16){
           if(checkExpiry(date)){
                return true;
            }else{
                remark="Credit Card Expired";
                return false;
            }
        }else{
            remark="Invalid Credit Card Number";
            return false;
        }
    }else{
        remark="Invalid Credit Card Type";
        return false;
    }
}

public void sendEmail(Order order, Address address, String remark)throws ParseException
{
    Email email = new Email(customer);
    if(this.isValid(cardType,cardNum,date)==true){
        email.success(order,address);
    }else{
        email.failure(this.getRemark());
    }
}

这是我目前使用的方法。但是,在 sendEmail() 方法的构造函数中进行方法调用时,一条错误消息告诉我“未报告的异常 java.text.ParseException;必须捕获或声明为抛出”。

我有两个问题:

1)我应该怎么做才能使类编译

2)是否有更简单/更有效的方法来检查包含日期的输入字符串是否在未来?

标签: java

解决方案


1)我应该怎么做才能使类编译

sendEmail被定义为抛出一个可能的ParseException

public void sendEmail(Order order, Address address, String remark)throws ParseException {...

任何调用它的方法/构造函数都需要处理或重新抛出异常。

我建议改变你的构造函数,所以它也会抛出ParseException......

public Payment(...,String date,...) throws ParseException {...

这将允许异常冒泡到原始调用者

然后调用者需要处理,可能通过捕捉它......

try {
    Payment payment = new Payment(...);
} catch (ParseException exp) {
    System.err.println("Failed to process your payment due to an error");
    // exp.printStackTrace();
}

或一些这样的

2)是否有更简单/更有效的方法来检查包含日期的输入字符串是否在未来?

这是一个广泛的问题。我的第一感觉是,不要接受字符串日期(对不起,但这对我来说是一个真正的错误熊)。

您的Payment班级应该只接受有效日期,将其转换String为日期值(或确定格式)不是其责任,这是其他人的责任。

说了这么多,我建议使用 Java 更新(和改进)的日期/时间功能......

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH);
LocalDate localDate = LocalDate.parse("16/10/2018", pattern);
System.out.println(localDate);

哪个打印2018-10-16

然后,您可以使用类似的东西LocalDate.now().isAfter(localDate)来测试日期是否已过期(任何变化isBefore和/或equals基于您的需要)


推荐阅读