Lỗi NullPointerException trong Java.

NullPointerException là một lỗi rất thường gặp khi lập trình Java, cho dù bạn có thể là một lập trình viên chuyên nghiệp, lâu năm cũng có thể gặp lỗi này. Tại sao ư? có rất nhiều nguyên nguyên nhân, tuy nhiên nguyên nhân lớn nhất code quá nhiều, quá nhiều đối tượng (object), quá nhiều (arrays), quá nhiều biến (variable), hoặc đơn giản là một lỗi ngới ngẩn khi bạn vô tình sử dụng giá trị NULL, hoặc đối tượng NULL để làm gì đó :))..


Bài viết này chúng ta sẽ nói chút về lỗi này, đầu tiên ta sẽ đi qua một ví dụ nhỏ để có thể tưởng tương ra được vấn đề mà chúng ta đang nói tới là gì? Bạn hãy xem một ví dụ đơn giản sau về NullPointerException (NullPointerException example) như sau:
package test;

import java.io.File;
import java.io.IOException;
/**
 *
 * @author bnson
 * @wesite vnlives.net
 */
public class Test {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Object obj = null;      
        System.out.println("Print: " + obj.toString());
    } 
}

Ok khi Clean and Build Applicaion thì không có bất kỳ vấn đề gì xảy ra, tuy nhiên khi bạn nhấn F6 (RUN) để run application bạn sẽ gặp được thông báo lỗi như bên dưới:
run:
Exception in thread "main" java.lang.NullPointerException
    at test.Test.main(Test.java:22)
C:\Users\bnson\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)


Ok kế vấn đề chúng ta đang nói tới ở đây chính là lỗi "java.lang.NullPointerException" như ví dụ mình họa ở trên, nào bây giờ chúng ta sẽ đi vào chi tiết của vấn đề đề.

NullPointerException là gì?

Điều đầu tiên NullPointerException là một RuntimeException của JAVA, điều thứ hai trong Java, một giá trị đặc biệt NULL có thể được gán cho một chiếu đối tượng (object), biến (variable), hàm (function), giá trị trả về (return),... và cuối cùng NullPointerException được ném ra khi một code (hay ứng dụng) cố gắng sử dụng một tham chiếu đối tượng có giá trị null.

Bạn có thể dễ nhìn thấy điều trên trong bài ví dụ phía trên, tôi đã có gắng tham chiếu tới đối tượng "obj" và chuyển đổi nó thành kiểu chuỗi "toString", vai khi chạy chương trình tôi sẽ bị lỗi "NullPointerException", tiếp theo chúng ta sẽ tìm hiểu các trường hợp xảy ra lỗi này.

Các trường hợp xảy ra lỗi NullPointerException.

Như đã trình bày ở bày ở trên lỗi NullPointerException có thể xảy ra trên object, variable, function, return, hay cái gì đó :)).. nên việc xác định cụ thể nó xảy ra ở đâu thì là không thể nói chung chung được, tuy nhiên như đã nói thì nguyên nhân xảy ra chỉ có một là do tham chiếu tới một đối tượng hay gì đó có giá trị null và sử dụng chúng, mình xin trình bày 2 trường hợp phổ biến mà mình tìm hiểu được.

Trường hợp 1:

Cố gắng gọi, truy cập hoặc sửa đổi một phương thức(method), đối tượng (object), biến (variable)... có giá trị NULL (bên bọn nước ngoài hay nói là reference NULL = tham chiếu tới giá trị NULL) và thao tác lên chúng. Bạn có thể nhận thấy điều này thông ví dụ trên, mình xin minh họa thêm một ví dụ về biến (variable).
package test;

import java.io.File;
import java.io.IOException;

/**
 *
 * @author bnson
 * @wesite vnlives.net
 */
public class Test {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Integer i = null;
        int j = i;
        //System.out.print("Print: " + j);       
    }

Như bạn thấy trong ví dụ tôi tạo một biến "Integer i = null" sau đó tôi cố gắng ép giá trị "i" có giá trị "null" về kiểu "int" và gắn nó vào biến "J" (int j = i tại đây nó sẽ thực hiện hai hành động chuyển i thành int và gắn giá trị i vào j), và thế là ta gặp lỗi.

Bạn nào tinh ý sẽ thắc mắc vậy nếu chuyển biến "j" thành kiểu "Integer" thì tại seo lại không sinh ra lỗi? nguyên nhân là việc này không xử lý, thao tác gì bên biến "i" hết và việc này chỉ tương giới việc gán "j = null" tương tự với việc gán "i = null" vậy thôi.

Ok dù rất muốn đưa ra một một số ví dụ như để tranh lang mang trong bài viết, nên việc này giao lại cho các bạn thử tưởng tượng, và đưa ra thêm một số ví dụ khác cho trường hợp này nhé :))..

Trường hợp 2:

Trường hợp thứ hai tính ra cũng tương đương như trường hợp một, như nó quá phổ biến và thường xuyên xảy ra, đặc biệt rất phức tạp, nên người ta phân nó ra thành trương hợp thứ hai là "đi qua các giá trị null từ bên ngoài" cụ thể ở đây là liên quan tới các kiểu dữ liệu dạng mảng [array], database, object, dữ liệu bên ngoài và chúng bị trả về NULL, kiểu như trên database cũng có lưu trữ được giá trị NULL và khi ta dùng các giá trị NULL này thì ta sẽ bị báo lỗi, một số trường hợp như là hàm (function), method (phương thức), trong số tình huống (dạng như rớt mạng, mất kết nối gì đó) thì nó sẽ trả về giá trị NULL.

Vì trường hợp khá phức tạp, dài, rắc rối nên tạm thời mình chưa thể đưa ra một ví dụ cụ thể cho trường hợp này tuy nhiên bạn có tham khảo trên Google Search "NullPointerException" kết hợp với cụm từ như là "Array", "Readfile", "Database",... bạn sẽ gặp một loạt các trường hợp từ khó tới dễ để ngâm cứu, hoặc tham khảo mộ số link bên dưới:

Bạn có thể  tự ngâm cứu và đưa ra ví dụ rõ ràng kèm giải thích, xong rùi thì share cho mình bổ sung nhé ^^!, bận quá còn phải tranh thủ ôn lại và ôn thêm các kiến thức mới nữa TT_TT.




Writer: +Bui Ngoc Son






No comments:

Post a Comment