如果不滿足某些條件,我必須創建這個學生存盤庫,其中需要拋出例外。我的問題是:我應該創建自己的自定義例外,還是應該使用預定義的例外?我將在下面留下我的一部分代碼
public class StudentRepository {
private static List<Student> studentList = new ArrayList<>();
private static Set<Student> studentsByAge = new TreeSet<>(new AgeComparator());
private static Set<Student> studentsByLastName = new TreeSet<>(new LastNameComparator());
public static Student addStudent(String firstName, String lastName, String gender, LocalDate dateOfBirth) {
if (firstName.trim().isEmpty() || lastName.trim().isEmpty()) {
throw new NullPointerException("Last name or first name field may be empty");
} else if (!(gender.equalsIgnoreCase("m") || gender.equalsIgnoreCase("f"))) {
throw new IllegalArgumentException("Gender should be 'M or 'F");
} else if (dateOfBirth.isBefore(LocalDate.of(1900, 1, 1)) ||
dateOfBirth.isAfter(LocalDate.now())) {
throw new IllegalArgumentException("Date of birth should be between 1900 and current year");
}
Student newStudent = new Student(firstName, lastName, dateOfBirth, gender);
studentList.add(newStudent);
return newStudent;
}
public static void deleteStudentByCnp(String cnp) {
Student studentToDelete = null;
for (Student student : studentList) {
if (student.getCnp().equals(cnp)) {
studentToDelete = student;
studentList.remove(studentToDelete);
break;
} else {
throw new NullPointerException("The student does not exist");
}
}
}
uj5u.com熱心網友回復:
您可以查看 Oracle 關于已檢查與未檢查例外主題的建議,這應該更清楚:https : //docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
該頁面的摘要如下
這是底線準則:如果可以合理地期望客戶端從例外中恢復,請將其設為已檢查例外。如果客戶端無法從例外中恢復,請將其設為未經檢查的例外。
您還可以在此處閱讀有關自定義例外與標準例外用法的更多資訊:https : //stackify.com/java-custom-exceptions/
通常這取決于客戶端的行為 - 客戶端可以用這個例外做什么。如果它只是記錄錯誤而僅此而已 - 那么 IllegalArgumentException 應該就足夠了,但是如果您隨后將此錯誤回傳給客戶端,例如使用 REST - 那么創建具有適當結構的自定義例外將是有意義的,該例外將被序列化并回傳以回應保持回應錯誤的一致結構。
無論如何,請不要使用NullPointerException除了某些意外為空的情況(即程式員的錯誤)。在您的情況下,我會用自定義例外替換 NullPointerExceptions。
uj5u.com熱心網友回復:
假設這些規則(性別必須是MorF等)被認為是先決條件(因為檔案指出:您傳遞的引數必須遵守這些規則),正確的例外拋出是IllegalArgumentException. 除了 param 不能為 null 的先決條件,在這種情況下NullPointerException是合適的。談論可恢復性不適用于這種例外——方法的作者不知道呼叫者是否是那種可以“合理地從例外中恢復”的代碼。他們很有可能不能(比如,它是通過網路提供的文本,并且沒有機制向呼叫者發回信號:呃,你沒有遵循那里商定的規范,或者它來自組態檔),所以在這里未經檢查可能更好。IllegalArgumentException剛好適合。
NullPointerException,不過,在這里顯然是非常糟糕的用法。那就是表示一個事情是空的,這不是預期的,就是這樣,所以不要像這樣濫用它!
請注意,您的代碼有很多問題:
- 2 性別?現在是 2021 年。這可能永遠不會被接受,但現在肯定不是。為什么你需要知道學生的性別?將正確的敬語放在字母上?擺脫性別并為“榮譽”添加一個欄位。許多國家都有指導方針,禁止在不相關時詢問性別。我在這里似乎無關緊要。(榮譽可能是;如果您需要,請要求)。
- 如果您想忽略它并強制使用 2 個性別,請強制使用它,并改為撰寫一個列舉。您想避免某些輸入可以宣告但無效的整個想法 - 因為那樣您需要繼續撰寫代碼以對無效狀態做出反應。如果一個物件或引數根本不可能是錯誤的,那就更好了。列舉不可能是錯誤的,或者至少,只有在例如它為空時才可能是錯誤的,這是一種更簡單的檢查。
- 您的“日期”錯誤顯示為“當前年份”,但實際上是在檢查當前日期。
- 性別錯誤有錯別字。
- 您的姓氏/名字訊息不清楚,并且不遵循 Java 樣式。你應該陳述規則,而不是問題。'名字和姓氏不得為空'。沒有什么“可能”的。
- 您的
delete方法將檢查串列中的第一個學生。如果它的 CNP 匹配,則將其洗掉,然后就完成了。如果不匹配,您的代碼會立即出錯。除了串列中的第一個之外,它從不掃描任何學生。該例外拋出需要在for回圈之外。 - a
Map在這里聽起來像是更好的資料結構;目前,隨著學生越來越多,您的洗掉代碼將花費越來越長的時間。 - 當您使代碼更通用時,“名字”和“姓氏”的概念也很可疑。這是個好訊息:它簡化了我們作為開發人員的生活。只需有一個“全名”欄位。現在,您不再需要計算如何將名字和姓氏組合在一起。您只需列印“全名”欄位的值。如果您需要更短的名稱,請將其添加為欄位。性別也一樣:不要根據性別找出正確的敬語,只需將“敬語”欄位的值放在那里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328255.html
上一篇:如何在增量資料上處理行數視窗函式
