• Thứ Ba, 18/09/2007 10:33 (GMT+7)

    NullPointerException trong Java có nghĩa là gì?

    Câu hỏi :
    Xin hỏi NullPointerException trong Java có nghĩa là gì? Cứ mỗi khi sử dụng Array tôi lại bị lỗi này. Nếu được xin cho biết một vài phương pháp để tránh Exception này. 
     

    Trả lời :

    Khi lập trình bằng Java (hay 1 ngôn ngữ hướng đối tượng khác), bạn nên phân biệt 2 kiểu dữ liệu khác nhau:

     • Kiểu dữ liệu cổ điển (định sẵn) như int, double... Một biến thuộc kiểu dữ liệu loại này sẽ chứa trực tiếp giá trị thuộc kiểu tương ứng. Thí dụ 1 biến nguyên (int) chứa 1 giá trị nguyên cụ thể tại từng thời điểm, thường nếu sau khi định nghĩa biến mà chưa gán tường minh giá trị cho biến thì mặc định chương trình dịch sẽ gán trị 0 cho biến đó. Tóm lại, sau khi định nghĩa 1 biến dữ liệu cổ điển, bạn có thể truy xuất nội dung của biến bất kỳ lúc nào (cho dù giá trị truy xuất được có phù hợp với yêu cầu của bạn hay không).

     • Kiểu dữ liệu đối tượng (tên của 1 class hay 1 interface). Một biến thuộc kiểu dữ liệu đối tượng không chứa trực tiếp nội dung của đối tượng, nó chỉ chứa thông tin để tham khảo tới đối tượng cần truy xuất. Sau khi định nghĩa 1 biến đối tượng, biến chưa tham khảo tới bất kỳ đối tượng nào cả (người ta dùng thuật ngữ "NullPointer" để miêu tả trạng thái này của biến đối tượng). Khi biến chưa tham khảo đến đối tượng cụ thể thì ta không thể truy xuất thuộc tính hay gọi tác vụ của đối tượng tương ứng, nếu ta cố tình truy xuất thuộc tính hay gọi tác vụ của đối tượng thông qua biến đối tượng đang ở trạng thái "NullPointer", máy sẽ tạo lỗi Exception tên là NullPointerException. Tóm lại, đối với biến đối tượng, trước khi truy xuất nó, ta phải gán tường minh tham khảo đến đối tượng cần thiết (thường dùng lệnh new để tạo đối tượng mới). Đoạn code Java sau demo việc dùng biến đối tượng một cách đúng đắn:
     
     MyClass mv; //định nghĩa biến đối tượng, nhưng chưa thể dùng nó
     ...
     mv = new MyClass(); //tạo đối tượng MyClass và gán tham khảo của nó vào biến mv
     mv.x = 5; //gán 5 vào thuộc tính x của đối tượng
     mv.op1(10); //gọi tác vụ op1 của đối tượng.
     
     Lưu ý rằng nếu bạn chưa tạo đối tượng và gán tham khảo của nó vào biến mv thì khi truy xuất thuộc tính hay gọi tác vụ thông qua biến mv, máy sẽ báo lỗi NullPointerException.

     Về biến array, đa số các ngôn ngữ khác cho phép khai báo tĩnh số lượng phần tử trong lệnh định nghĩa biến array (thí dụ trong C, ta có thể viết lệnh : int a[10];), nhưng trong Java, khi định nghĩa biến array, ta không được phép miêu tả tĩnh số lượng phần tử của array mà phải yêu cầu phân phối động thông qua lệnh new khi cần thiết. Đoạn code Java sau demo việc dùng biến array đúng đắn:

     int a[]; //định nghĩa biến array, nhưng chưa nói chính xác có bao nhiêu phần tử.
     ...
     a = new int[10]; //xin phân phối 10 phần tử a[0] tới a[9]
     a[0] = 0; //gán 0 vào phần tử a[0]
     a[9] = 9; //gán 9 vào phần tử a[9]
     Lưu ý rằng nếu bạn chưa dùng lệnh new để yêu cầu phân phối các phần tử cho dãy a thì bạn không thể truy xuất bất kỳ phần tử a[i] nào (vì chưa có).
     

    Chuyên mục: Lập trình