Bạn hẳn đã bắt gặp một thứ gọi là NullPointerException nếu bạn đã làm việc trên các ứng dụng dựa trên Java. Null Pointer Exception là một trong những lỗi phổ biến nhất trong quá trình phát triển ứng dụng Java. Ngoại lệ này thường là do lỗi của con người, nhưng thời gian có thể bị lãng phí khi gỡ lỗi các lỗi như thế này. Vấn đề này không hoàn toàn là một lỗi cú pháp, vì vậy đôi khi có thể khó xác định được vấn đề.
Trong bài viết này, chúng ta sẽ xem xét java.lang.NullPointerException là gì, tại sao nó lại xảy ra, cách bạn có thể khắc phục nó và một số phương pháp hay nhất cần tuân theo để tránh chạy vào con trỏ rỗng. Không cần phải quảng cáo thêm, hãy bắt đầu.
java.lang.NullPointerException là gì?
Ngoại lệ con trỏ Null là một trong số các Ngoại lệ được hỗ trợ bởi ngôn ngữ Java. Điều này cho thấy rằng một nỗ lực đã được thực hiện để truy cập một biến tham chiếu hiện trỏ đến null.
Null là giá trị mặc định trong Java được gán cho các biến không được khởi tạo bởi người dùng sau hoặc với một khai báo. Hãy xem xét ví dụ sau, nơi bạn khai báo một biến như thế này:
String str;
Và sau đó cố gắng in nội dung của biến:
System.out.println(str); // => null
Như có thể thấy ở trên, ‘null’ được in trên đầu ra. Điều này cho thấy rằng vì biến str chưa được khởi tạo, nó hiện trỏ đến hoặc giữ giá trị null. Vấn đề mà một biến trỏ null đặt ra là biến chỉ là một tham chiếu và nó không trỏ đến bất cứ thứ gì. Nếu bạn cố gắng thực hiện một số thao tác trên dữ liệu được lưu trữ trong biến trỏ null, hệ thống sẽ không biết phải làm gì. Điều này xảy ra bởi vì không có dữ liệu thực sự được lưu trữ trong biến; nó trỏ đến một thực thể vô hiệu.
Ví dụ về java.lang.NullPointer.Exception
Tìm kiếm các ví dụ về java.lang.NullPointerException không phải là một nhiệm vụ khó khăn, vì tất cả những gì bạn cần làm là không khởi tạo một biến trước khi cố gắng truy cập nó. Ví dụ:hãy xem xét lớp StringBuilder. StringBuilder là một lớp được sử dụng để xử lý việc hình thành và thao tác các chuỗi. Đây là cách bạn thường sử 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 bạn chạy đoạn mã trên, nó sẽ hoạt động tốt. Hãy xem phiên bản sửa đổi của nó sẽ đưa ra một ngoại lệ con trỏ null:
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia chương trình đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
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ư bạn có thể thấy, chúng tôi đã không khởi tạo một thể hiện của lớp StringBuilder trong khi khai báo nó. Khi sb.append()
các dòng được thực thi, sb không trỏ đến bất kỳ đối tượng nào trong thực tế, thay vào đó nó trỏ đến null. Đây là nơi NullPointerException được ném. Do ngoại lệ được ném ra, JVM không thể thực thi bất kỳ câu lệnh nào sau đó.
Cách sửa lỗi java.lang.NullPointerException
Việc tạo Null Pointer Exception rất dễ dàng, nhưng việc tránh hoặc sửa nó thì rất khó. Trong khi một số môi trường phát triển tích hợp (IDE) cảnh báo bạn nếu bạn đang truy cập một biến trước khi khởi tạo nó với một số giá trị tương thích, hầu hết các IDE không thể tìm ra điều này trong các tình huống phức tạp, chẳng hạn như khi truyền một biến qua nhiều lần gọi phương thức. Bản sửa lỗi chính xác cho Null Pointer Exception tùy thuộc vào tình huống và mã của bạn. Dưới đây là một số cách hàng đầu để khắc phục các tình huống Null Pointer phổ biến:
Kiểm tra mã của bạn để biết lỗi thủ công
Lý do lớn nhất tại sao Null Pointer Exceptions xảy ra là do lỗi của con người. Đảm bảo rằng chương trình bạn đã viết mang đúng logic mà bạn đã dự định ban đầu. Ngoài ra, hãy xem qua mã nguồn để kiểm tra xem bạn có bỏ sót câu lệnh nào hoặc viết sai chính tả bất kỳ biến nào có thể dẫn đến một số biến không được gán giá trị hay không.
Đảm bảo rằng bạn đã viết mã của mình theo cách logic của bạn hướng bạn đến và bạn không bỏ sót khi viết bất kỳ câu lệnh nào hoặc không gán các đối tượng cho các tham chiếu sai. Theo nguyên tắc chung, hãy kiểm tra xem trước khi sử dụng bất kỳ biến nào, nó đã được khởi tạo bằng một đối tượng hay chưa.
Đặt Kiểm tra an toàn xung quanh mã có thể gây ra ngoại lệ con trỏ rỗng
Nếu bạn biết dòng mã gây ra NullPointer của bạn và tin rằng logic của bạn cũng đúng, bạn có thể bọc phần mã trong một khối try-catch và xác định hành vi khi một Null Pointer bị bắt. Đây là cách thiết lập như vậy sẽ như thế nào:
... // 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 trong các tình huống mà một biến tham chiếu nhất định có thể chứa hoặc không chứa null. Thường xuyên hơn không, các phản hồi API từ xa, phản hồi giao diện thiết bị dễ xảy ra trường hợp này. Tùy thuộc vào sự sẵn có của một kết quả hoặc phần cứng, biến phản hồi có thể trỏ đến một đối tượng khởi tạo hoặc không. Sử dụng kiểm tra an toàn là phù hợp nhất để xử lý những tình huống này.
Kiểm tra Null trước khi Truy cập Thứ gì đó
Phương pháp này tương tự như phương pháp try-catch. Trong phương pháp này, một khối ‘if’ được sử dụng để kiểm tra các giá trị null trước khi truy cập một biến. Dưới đây là cách đoạn mã trước đó sẽ trông như thế nào nếu khối 'if' được sử dụng để bắt lỗi:
... // Some code above If (myVar !== null ) { // Put the success logic here } else { // Handle null value here } // Some code below ...
Sự khác biệt lớn nhất giữa hai phương pháp là phạm vi kiểm tra mà chúng thực hiện. Phương thức if chỉ kiểm tra biến myVar đối với các giá trị null, trong khi khối try-catch bắt bất kỳ và tất cả các biến có giá trị rỗng.
Điều này làm cho khối ‘if’ trở thành một cách tiếp cận được nhắm mục tiêu và rõ ràng hơn để cung cấp các con trỏ null trong logic ứng dụng của bạn. Tuy nhiên, nếu có nhiều hơn một biến có thể là giá trị rỗng, tốt hơn nên sử dụng khối try-catch để đơn giản hóa.
Kết luận
Bài viết này đã xem xét Null Pointer Exception là gì trong Java và lỗi này xảy ra như thế nào. Chúng tôi cũng đã xem xét một đoạn mã sẽ gây ra Ngoại lệ Con trỏ Null để hiểu cách Con trỏ Null được tạo ra trong các tình huống thực tế. Cuối cùng, chúng tôi đã xác định một số cách hàng đầu để sửa lỗi Null Pointer Exception và kết thúc cuộc thảo luận của chúng tôi bằng cách đối chiếu giữa hai phương pháp sửa NPE.
Nếu bạn đang muốn viết các chương trình Java, thì Null Pointer Exception là một trong những lỗi cơ bản mà bạn phải biết cách sửa. Ngoại lệ này là một trong những vấn đề thường gặp nhất và không liên quan đến cú pháp hoặc ngữ nghĩa mã của bạn. Điều này khiến ngoại lệ trở thành một trong những vấn đề khó xác định và khắc phục nhất. Tham khảo nhanh để khắc phục sự cố như bài viết này chắc chắn sẽ giúp trải nghiệm của bạn mượt mà hơn.