java - 使用解析检查输入字符串日期是否在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)是否有更简单/更有效的方法来检查包含日期的输入字符串是否在未来?
解决方案
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
基于您的需要)
推荐阅读
- swift - 使用 firebase 更新值
- c# - 如何将 WPF 值绑定到类中的类
- python - ffmpeg hls 段在 5300 段后停止分段
- vba - Word 2016/2019 在 wdDialogFileNew 上崩溃
- javascript - 在采取任何行动之前如何正确等待退货?
- php - 分块调用 Microsoft Graph 日历时出现 504 网关超时
- asp.net - 如何实现 .NET Core 以支持多个操作系统
- django - 如何在 django 中指向模板
- sql-server - 连接表并在一行中显示第二个表数据
- spark-ar-studio - 视频纹理 Spark AR 在设备上运行时崩溃