Java lang nullpointerexception null là lỗi gì năm 2024
Trong bài này, tôi muốn chia sẽ với các bạn một vài kinh nghiệm code để hạn chế lỗi NullPointerException (NPE) trong chương trình Java. Show Nguyên tắc chung: KHÔNG khởi tạo, truyền tham số, trả kết quả về là một giá trị NULL và giữ cho code càng đơn giản càng tốt. Dưới đây là một vài kỹ thuật hạn chế lỗi NPE: Nội dung Return giá trịReturn một EMPTY collection thay vì giá trị NULLTrong Java, mặc định một biến Object được định nghĩa sẽ có giá trị null. Các Collection như List, Set, Map, … được sử dụng rất nhiều trong ứng dụng. Nếu mọi phương thức đều return về null, thì khi sử dụng chúng ta phải kiểm tra null ở khắp mọi người và điều này không cần thiết cũng như gây code rất khó đọc. Một ví dụ dễ thấy nhất là các bạn có một class DAO, class này có nhiệm vụ truy vấn dữ liệu từ database. class UserDao {
public List Như bạn thấy, chúng ta phải check null ở khắp nơi (showUsers, exportToCsv). Thử tưởng tượng nếu chúng ta return về một empty list thì khi đó chúng ta chỉ việc lấy ra và sử dụng, không cần quan tâm những đoạn code vô nghĩa về mặt business. Đối với Collection, chúng ta có thể sử dụng từ khóa new hoặc sử dụng các phương thức sau để khởi tạo mọi Collection rỗng sử dụng lớp tiện ích java.util.Collections.
Return một EMPTY StringCác bạn có thể return một chuỗi rỗng “” hoặc sử dụng một constant có sẵn, chẳng hạn org.apache.commons.lang.StringUtils.EMPTY Return một giá trị Unknown/ Default thay vì NullSử dụng Null Object Pattern: public User getUser(UserType type){ }Có thể viết tránh lỗi NULL như sau: public User getUser(UserType type){ }
class NullUser extends User { }Luôn kiểm tra NULL trước khi sử dụngĐiều này nói ra thì hơi trái ngược với return về empty data và không cần check null. Nếu tất cả mọi người đều tuân thủ theo quy ước chung về return empty data thay vì null thì chúng ta sẽ không cần check null, mọi thức qua tuyệt vời. Nhưng đôi khi có một số trường hợp chúng ta cần return về null hay trong các hệ thống code cũ (legacy code) thì điều này là nên làm. Kiểm tra Null-safeVí dụ: if("Hello".equals(hello)) { } Thay vì: if(hello != null) { }
// hoặc
if(hello.equals("Hello")) { }Hạn chế sử dụng multi-dot syntaxTuân thủ theo . getLoggedinUser().getUser().getRole().setRoleName("Developer"); Như bạn thấy đoạn code trên rất dễ gặp lỗi NPE nếu bất kỳ object LoggedinUser, User, hay Role trả về giá trị null. Khởi tạo giá trị trước khi sử dụngMột trong những thói quen tốt giúp giảm NPE rất nhiều là khởi tạo giá trị empty cho các property khi một instance của object được tạo. Có một số chỗ có thể khởi tạo giá trị cho property như sau: Khởi tạo ngay khi khai báo property : private List Khởi tạo trong hàm constructor: public UserManager() { }Khởi tạo trong Getter: public List Sử dụng tính năng mới trong Java 8 – OptionalTrong Java 8, chúng ta có một lớp Optional mới được giới thiệu trong gói java.util. Nó được sử dụng để kiểm tra xem một biến có giá trị tồn tại giá trị hay không. Ưu điểm chính của cấu trúc mới này là không có quá nhiều kiểm tra null và tránh lỗi NullPointerException (NPE) lúc runtime. |