簡體   English   中英

Java的。 限制日期的值

[英]Java. Restricting the values for a Date

對你們來說,這似乎是一個愚蠢的問題,但是我是一個Java新手,並且仍在嘗試掌握整個概念。 因此,我基本上有一個簡單的劇院管理系統,可以將組添加到數據庫中。 您可以向每個組添加每個學生都有唯一的學生ID和名稱的學生。 您還可以將排練日期添加到組中。 這兩個都存儲在單獨的鏈接列表中。 這是我的排練對象:

public Rehearsal(int d, int m, int y) {
    day = d;
    month = m;
    year = y;
}

這是組類中的addRehearsal方法:

public void addRehearsal(int d, int m, int y) {
    Rehearsal newrehearsal = new Rehearsal(d, m, y);
    if (!RehearsalDates.contains(newrehearsal)) {
        RehearsalDates.add(newrehearsal);
    }
    else
        JOptionPane.showMessageDialog(null, "Rehearsal already exists for this group!", "Error", JOptionPane.WARNING_MESSAGE);
}

我的問題是,如何以及在何處限制可以輸入的值。 這意味着,如果為int d> 31或int m> 12輸入的值,則該程序將以消息對話框的形式給出錯誤消息。由於用戶可以為用戶創建排練日期,因此這一年實際上並不需要。過去和未來。

謝謝您的幫助:)

驗證日期比檢查每個參數更為復雜。 例如,即使所有參數都在“范圍內”,用(29, 2, 2000)調用它也是無效的(記得2000年不是 a年)。

唯一明智的檢查方法是嘗試從參數解析Date並捕獲異常。 有兩種方法可以執行此操作,但最簡單的方法是:

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
    }
    // rest of code
}

請注意必須調用setLenient() ,否則無效的輸入將“滾動”到下一個可用的有效日期-例如, 36-12-2012將被解析為05-01-2013

放置此代碼的最佳位置是在構造函數中,引發異常:

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
        throw new IllegalArgumentException();
    }
    day = d;
    month = m;
    year = y;
}

無論在何處調用它,您都可以抓住它。

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}
// rest of method

更好的設計是傳遞Date對象,使調用者有責任驗證輸入,並且拋出和捕獲的代碼更少。

為什么不從Rehearsal的構造函數中拋出IllegalArgumentException ,然后在addRehearsal方法中捕獲它:

public Rehearsal(int d, int m, int y) {
    if (d < 1 || d > 31) {
        throw new IllegalArgumentException("Invalid day");
    }
    if (m < 1 || m > 12) {
        throw new IllegalArgumentException("Invalid month");
    }
    day = d;
    month = m;
    year = y;
}

並在addRehearsal方法中捕獲構造異常:

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}

那應該是一個中間解決方案-它肯定會防止創建無效日期。

然后,您可能希望稍后在輸入中添加偵聽器,以首先防止出現無效數據。

最后,您可能要考慮使用Calendar而不是自定義日期對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM