Bạn chắc hẳn gặp NullPointerException nếu từng làm ứng dụng Java. Null Pointer Exception là một trong những lỗi phổ biến nhất phát triển ứng dụng Java. Ngoại lệ này thường do lỗi con người, nhưng thời gian có thể lãng phí debug lỗi như này. Vấn đề này không hoàn toàn lỗi cú pháp, nên khó xác định vấn đề đôi khi.
Trong bài này, xem java.lang.NullPointerException là gì, tại sao xảy ra, cách sửa, và một số thói quen tốt tránh con trỏ null hoang dã. Không nói thêm, hãy bắt đầu.
java.lang.NullPointerException là gì?
Null Pointer Exception là một trong các Exception hỗ trợ bởi ngôn ngữ Java. Điều này chỉ ra đã có cố gắng truy cập biến tham chiếu (reference variable) hiện trỏ đến null.
Null là giá trị mặc định Java gán cho biến chưa khởi tạo bởi người dùng sau hoặc cùng khai báo. Xem ví dụ khai báo biến như sau:
String str;
Sau đó thử in nội dung biến:
System.out.println(str); // => null
Như thấy, 'null' in ra đầu ra. Cho thấy vì biến str chưa khởi tạo, nó hiện trỏ đến, hoặc giữ giá trị, null. Vấn đề biến trỏ null nêu ra là biến chỉ là tham chiếu, không trỏ đến thứ gì. Nếu cố thực hiện thao tác dữ liệu lưu trong biến trỏ null, hệ thống không biết làm gì. Điều này xảy ra vì không dữ liệu thực tế lưu trong biến; nó trỏ đến thực thể rỗng (void entity).
Ví dụ java.lang.NullPointer.Exception
Tìm ví dụ java.lang.NullPointerException không khó, vì chỉ cần không khởi tạo biến trước khi truy cập. Ví dụ, xem lớp StringBuilder. StringBuilder là lớp xử lý hình thành và thao tác chuỗi. Cách dùng lớp tạo chuỗi:
import java.util.StringBuilder; public class Test { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("Hello "); sb.append("World!"); String result = sb.toString(); System.out.println(result); // => Hello World! } } Nếu chạy đoạn trên, hoạt động tốt. Hãy xem phiên bản sửa đổi ném null pointer exception:
81% of participants stated they felt more confident about their tech job prospects after attending a bootcamp. Get matched to a bootcamp today.
The average bootcamp grad spent less than six months in career transition, from starting a bootcamp to finding their first job.
import java.util.StringBuilder; public class Test { public static void main(String[] args) { StringBuilder sb; sb.append("Hello "); sb.append("World!"); String result = sb.toString(); System.out.println(result); } } Như thấy, chúng ta không khởi tạo thể hiện StringBuilder khi khai báo. Khi dòng sb.append() thực thi, sb không trỏ đến đối tượng thực, mà trỏ đến null. Đây là nơi NullPointerException ném ra. Do ngoại lệ ném, JVM không thực thi câu lệnh sau này.
Cách sửa lỗi java.lang.NullPointerException
Tạo Null Pointer Exception dễ, nhưng tránh hoặc sửa khó. Mặc dù một số IDE (integrated development environments) cảnh báo nếu truy cập biến trước khi khởi tạo giá trị tương thích, hầu hết IDE không giải quyết tình huống phức tạp, như truyền biến qua nhiều lần gọi phương thức. Cách sửa chính xác Null Pointer Exception tùy tình huống và mã. Đây là vài cách hàng đầu sửa các tình huống Null Pointer phổ biến:
Kiểm tra mã lỗi thủ công (Check Your Code For Manual Errors)
Lý do lớn nhất Null Pointer Exception xảy ra là lỗi con người. Đảm bảo chương trình viết mang logic đúng như ý định ban đầu. Cũng chạy mắt qua mã nguồn kiểm tra xem có bỏ sót câu lệnh, hoặc đánh sai biến dẫn đến biến không gán giá trị.
Đảm bảo viết mã theo logic chỉ đạo, không bỏ viết câu lệnh, hoặc gán đối tượng tham chiếu sai. Theo quy tắc chung, kiểm tra trước khi biến dùng, nó được khởi tạo với đối tượng.
Đặt kiểm tra an toàn quanh mã có thể gây Null Pointer Exception (Put Safety Checks Around Code That May Cause Null Pointer Exception)
Nếu biết dòng mã gây NullPointer và tin logic đúng, bạn gói đoạn mã trong khối try-catch, và định nghĩa hành vi khi Null Pointer bắt được. Cách thiết lập trông như sau:
... // Some code above try { // Put the exception-prone code here } catch (NullPointerException npe) { // Define what needs to be done when an NPE is caught } // Some code below ... Điều này xảy ra khi biến tham chiếu nhất định có thể hoặc không chứa null. Thường hơn không, phản hồi API từ xa (remote API responses), phản hồi giao diện thiết bị (device interface responses) dễ gặp tình huống này. Tùy khả dụng kết quả hoặc phần cứng, biến phản hồi có thể hoặc không trỏ đến đối tượng khởi tạo. Dùng kiểm tra an toàn phù hợp xử lý tình huống này.
Kiểm tra Null trước khi truy cập (Check For Null Before Accessing Something)
Phương pháp này tương tự try-catch. Dùng khối 'if' kiểm tra giá trị null trước khi truy cập biến. Cách đoạn mã trước trông như dùng 'if' bắt lỗi:
... // Some code above If (myVar !== null ) { // Put the success logic here } else { // Handle null value here } // Some code below ... Khác biệt lớn nhất hai phương pháp là phạm vi kiểm tra. Phương pháp if kiểm tra myVar chỉ cho giá trị null, trong khi try-catch bắt tất cả biến null.
Điều này làm 'if' block cách tiếp cận mục tiêu và sạch hơn chứa con trỏ null trong logic ứng dụng. Tuy nhiên, nếu nhiều hơn một biến có thể null, tốt hơn dùng try-catch cho đơn giản.
Kết luận
Bài viết xem Null Pointer Exception là gì trong Java, và cách lỗi xảy ra. Chúng ta cũng xem đoạn mã gây Null Pointer Exception hiểu cách Null Pointers tạo trong tình huống thực. Cuối cùng, xác định vài cách hàng đầu sửa Null Pointer Exception và kết thúc bằng đối比 hai phương pháp sửa NPE.
Nếu muốn viết chương trình Java, Null Pointer Exception là một trong những bug thiết yếu phải biết sửa. Ngoại lệ này là vấn đề thường xuyên và không liên quan cú pháp hoặc ngữ nghĩa mã. Điều này làm ngoại lệ một trong những vấn đề khó xác định và sửa. Tài liệu tham khảo nhanh sửa vấn đề như bài này chắc chắn làm trải nghiệm mượt mà hơn.