[英]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.