在處理列舉型別的資料時,若這個資料存入資料庫時允許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(OptionaloptName){ 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初階程式設計