首页 > 解决方案 > Java 中的日期验证失败

问题描述

我对 Java 编程完全陌生,我正在尝试创建一个 Java FX 项目。我遵循了有关日期验证方法的教程,但它似乎失败了。在这一部分中,我必须制作一个列表,其中包含用户在文本字段中插入的对象。这包括一个日期,但它必须是有效的。

在这段代码下面,我需要验证的对象是datep。我创建了一个方法,如果字符串有效,它应该将我的标志设置为 true 并返回它。在创建列表之前,我插入了一个if语句来检查我的标志是否设置为 true,这意味着根据格式验证日期。当我运行它时,即使日期无效,它也会创建列表。我我将 if 语句放在错误的部分?因为我认为方法很好。

@Override
public void handle(MouseEvent event) {
    if (event.getSource() == NewrentBtn) {
    
    String vehiclen =OximaTxT.getText();
    String clientn = ClientTxT.getText();
    String store = StoreTxT.getText();
    String storer = StorerTxT.getText();
    String timerp = TimeTxT.getText();
    String timer = TimerTxT.getText();
    String datep = DateTxT.getText(); // <-------------
    String dater = DaterTxT.getText();
    Integer sum = Integer.parseInt(SumTxT.getText());    
    if(flag = true) { // <------------
        createRental(id, vehiclen, store, datep, timerp, clientn, storer, dater, timer, sum);
        clearTextFields();
    }
}

public boolean Checkdate(String datep) { // <-------------
    
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    Date BOD = null;
    df.setLenient(false);
    
    try
    {
        BOD = df.parse(datep); // <----------------
        flag = true;
    }
    catch(Exception e)
    {
        flag = false;
    }
    return flag;
}

public void createRental(int id,String vehiclen,String store,String datep,String timerp,String clientn,String storer,String dater,String timer,int sum ) {
    Rental m = new Rental(id,vehiclen,store,datep,timerp,clientn,storer,dater,timer,sum);
    RentalList.add(m);
    rentalTableView.getItems().add(m);
            
}

标签: javajavafx

解决方案


从您在这里尝试实现的外观来看,我建议修改代码。

首先让我向您解释我发现的两个问题:第一个是您缺少对 Date 的验证方法的调用,即CheckDate(datep)当您收到文本输入并存储 flag 变量时的调用,或者所以看起来我们没有完整的代码(没关系);其次,您在 中缺少 a =if(flag = true)应该是if(flag == true)

所以这里是完整的代码:

@Override
public void handle(MouseEvent event) {
    if (event.getSource() == NewrentBtn) {

        String vehiclen =OximaTxT.getText();
        String clientn = ClientTxT.getText();
        String store = StoreTxT.getText();
        String storer = StorerTxT.getText();
        String timerp = TimeTxT.getText();
        String timer = TimerTxT.getText();
        String dater = DaterTxT.getText();
        Integer sum = Integer.parseInt(SumTxT.getText());
        String datep = DateTxT.getText();

        boolean flag = Checkdate(datep);
        if(flag == true) {
            createRental(id,vehiclen,store,datep,timerp,clientn,storer,dater,timer,sum);
            clearTextFields();
        }
    }
}

这样,您就可以验证日期格式是否正确,如果符合您的方案,则继续该过程。

最后,我有三个建议,因为您是 Java 编程新手:

  1. 对于所有方法,第一个字母应始终为小写,public boolean checkDate()这样您可以将方法与类区分开来,类始终以大写开头,如public class Product. 唯一的例外是类的构造函数。
  2. 您永远不应该将graphical interface逻辑与logical processing逻辑混为一谈。这是:您应该将处理部分保存在一个包中,将图形组件保存在另一个包中,并通过processing logicgraphical interface.
  3. 用户输入验证应直接在处理程序方法中使用 try-catch 子句进行,如下所示。

这里:

public void handle(MouseEvent event) {
    if (event.getSource() == NewrentBtn) {

        String vehiclen =OximaTxT.getText();
        String clientn = ClientTxT.getText();
        String store = StoreTxT.getText();
        String storer = StorerTxT.getText();
        String timerp = TimeTxT.getText();
        String timer = TimerTxT.getText();
        String dater = DaterTxT.getText();
        Integer sum = Integer.parseInt(SumTxT.getText());
        try {
            String datep = DateTxT.getText();
            SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            df.parse(date);
            createRental(id,vehiclen,store,datep,timerp,clientn,storer,dater,timer,sum);
            clearTextFields();
        } catch (ParseException e) {
            /* Here you handle what happens when if fails, you can create a JDialog to show
            the error or create an alert, whatever you need */
            e.printStackTrace();
        }
    }
}

瞧,一个更清洁的版本


推荐阅读