在處理列舉型別的資料時,若這個資料存入資料庫時允許null(也就是所謂的非必要欄位)時,從資料庫讀出資料時常會因為少了null檢查而發生NullPointerException。
這樣的資料多半也允許使用者在輸入項中輸入空字串,而空字串在做列舉型別的資料轉換時又會造成IllegalArgumentException!這些都剛好是RuntimeException,所以開發人員往往忽略了這類錯誤處理而造成執行時期錯誤!
以下的程式碼模擬了這樣的情形:
1. public class TestNullableBloodType {
2. public static void main(String[] args) {
3. //模擬狀況1: 自資料庫讀出血型為"AB"的資料
4. String bType1 = "AB";
5. System.out.println(BloodType.valueOf(bType1));//成功轉換並輸出正確血型
6.
7. //模擬狀況2: 自資料庫讀出一筆血型為null的資料
8. try {
9. String bType2 = null;
10. System.out.println(BloodType.valueOf(bType2)); //NullPointerException
11. } catch (NullPointerException ex) {
12. System.out.println("第10行發生:"+ex);
13. }
14.
15. //模擬狀況3: 前端使用者輸入血型為""的資料(表示未輸入血型資料)
16. try {
17. String bType3 = "";
18. System.out.print(BloodType.valueOf(bType3)); //IllegalArgumentException
19. } catch (IllegalArgumentException ex) {
20. System.out.println("第18行發生:"+ex);
21. }
22. }
23. }
24.
25. enum BloodType {
26. O, A, B, AB;
27. }
現在只要運用JDK 8的Optional類別就能提供簡潔又安全的程式來避免這樣的錯誤。以下為加上了Optional類別的程式示範:
1. public class TestNullableBloodType {
2. public static void main(String[] args) {
3. //模擬狀況1: 自資料庫讀出血型為"AB"的資料
4. String bType1 = "AB";
5. BloodType bloodType1 = BloodType.valueOf(Optional.ofNullable(bType1));
6. System.out.println(bloodType1);//成功轉換並輸出正確血型
7.
8. //模擬狀況2: 自資料庫讀出一筆血型為null的資料
9. String bType2 = null;
10. BloodType bloodType2 = BloodType.valueOf(Optional.ofNullable(bType2));
11. System.out.println(bloodType2); //成功轉換並輸出null
12.
13. //模擬狀況3: 前端使用者輸入血型為""的資料(表示未輸入血型資料)
14. String bType3 = "";
15. BloodType bloodType3 = BloodType.valueOf(Optional.ofNullable(bType3));
16. System.out.println(bloodType3); //成功轉換並輸出null
17. }
18. }
19.
20. enum BloodType {
21. O, A, B, AB;
22.
23. public static BloodType valueOf(Optional optName){
24. if(optName.isPresent() && !optName.get().isEmpty()){
25. return BloodType.valueOf(optName.get());
26. }else{
27. return null;
28. }
29. }
30. }
您可在下列課程中了解更多技巧喔!
相關學習資源
【SL-110-SE8】Java SE8初階程式設計