9 Cách sửa lỗi NullPointerException trong Java

Ngày đăng: 02/06/2020   -    Cập nhật: 14/04/2021
Chào bạn, là một người đang học Java / lập trình viên Java chắc hẳn bạn cũng đều phải xử lý những lỗi, ngoại lệ.


Và một trong những lỗi, ngoại lệ khá quen thuộc và rất hay mắc phải đó là NullPointerException.


Trong bài viết này chúng ta cùng nhau tìm hiểu về NullPointerException trong Java và cách khắc phục nó như thế nào nhé.



Các sửa lỗi NullPointerException trong Java

Các sửa lỗi NullPointerException trong Java


Nội dung của bài viết này gồm:


  • Lỗi NullPointerException xảy ra khi nào?
  • Cách sửa lỗi NullPointException trong Java


1. Lỗi NullPointerException xảy ra khi nào



NullPointerException (viết tắt NPE) là một RuntimeException. Trong Java, một giá trị null đặc biệt có thể được gán cho một tham chiếu của đối tượng.


Lỗi NullPointerException được ném ra khi chương trình cố gắng tham chiếu tới một đối tượng nhưng nó không có vị trí nào trên bộ nhớ, tức là có giá trị null.


Việc gọi một method tham chiếu null hoặc cố gắng truy cập một trường tham chiếu null là một trong những nguyên nhân phổ biến gây ra lỗi NullPointerException trong Java.


Ngoài ra, một số trường hợp có thể gây ra lỗi NullPointerException như sau:



  • Gọi một phương thức từ một đối tượng null
  • Truy cập hoặc sửa đổi một thuộc tính null của object
  • Lấy chiều dài của mảng nhưng mảng đó bị null
  • Truy cập hoặc sửa đổi các vị trí của đối tượng null, ví dụ là mảng, list,…
  • Ném ra một null như nó là một giá trị Throwable
  • Cố gắng đồng bộ hóa trên một đối tượng null


Sau đây mình sẽ code demo cho các bạn một trường hợp sinh ra lỗi NPE nhé.


Trong đoạn code này mình sẽ cố tình truy cập vào một phần tử không tồn tại trong mảng và để xem chương trình sẽ in ra cái gì.




// Cố gắng tạo ra lỗi NullPointerException
// Bằng cách truy cập phần từ không tồn tại trong một mảng 
public class Demo {
    public static void main (String[] args) {
        int[] arr = null;

        System.out.print(arr[6]);
    }
}
 


Và đây là kết quả:

Ví dụ về trường hợp xảy ra lỗi NullPointerException trong Java

Ví dụ về trường hợp xảy ra lỗi NullPointerException trong Java


Ở đây mình đã cố tình truy cập vào một phần tử của mảng arr, nhưng mảng này lại có giá trị null. Vì vậy chúng ta sẽ nhận lại được một lỗi NullPointerException.


2. Cách sửa lỗi NullPointerException trong Java



Với những gì đã trình bày ở phần 1, thì làm sao chúng ta có thể khắc phục, tránh được lỗi NullPointerException?


Mình sẽ chia sẻ một vài cách dưới đây.



Cách #1: Sử dụng IDE để tránh lỗi NullPointerException



Ở trong các IDE ví dụ như Eclipse, nó sẽ đưa ra cảnh báo cho bạn về lỗi NPE.


Ví dụ như trong eclipse khi mình code đoạn code ở ví dụ trong phần 1, nó sẽ đưa ra warning, arr[6] sẽ bị kẻ vàng ở bên dưới, khi đó chúng ta trỏ vào arr[6] sẽ hiện lên một cảnh báo như sau:

 
Eclipse IDE hỗ trợ phát hiện lỗi NullPointerException trong Java

Eclipse IDE hỗ trợ phát hiện lỗi NullPointerException trong Java


Nhờ sự trợ giúp của IDE, ta có thể chủ động tránh được NPE.


Tuy nhiên không phải trong trường hợp nào IDE cũng phát hiện ra và cảnh báo warning cho bạn đâu nhé.


Vì vậy ta không nên trông chờ quá nhiều vào IDE.



Cách #2: Return một empty collection thay vì giá trị null để tránh lỗi NullPointerException




​Trong Java, mặc định một biến Object được định nghĩa sẽ có giá trị null.


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 ở nhiều nơi và điều này không cần thiết cũng như làm cho code rất khó đọc.


Chính vì thế, các Collection như List, Set, Map, … được sử dụng rất nhiều trong ứng dụng.


Đố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.



  • Đối với List: Collections.emptyList()
  • Đối với Set: Collections.emptySet()
  • Đối với Map: Collections.emptyMap()


Cách #3: Return một giá trị Unkown/Default thay về một giá trị null


 
Ví dụ đoạn code return về một giá trị null




public Data getData(DataType data){
    if(data == 1) {
        return getData();
    }
    return null;
}
 


Thay vì return về một giá trị null như bên trên thì bạn nên return về Unkown/Default như sau:



class NullData extends Data {

}

public Data getUser(DataType data){
    if(data == 1) {
        return getData();
    }

    return NullData();
}
 


Cách #4: Luôn kiểm tra null trước khi sử dụ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.


Cách #5: Kiếm tra String null sau lệnh trim()



Để thực hiện cách xử lý NullPointerException này thì hãy xem ví dụ sau:



public static boolean isNullOrEmptyAfterTrim(String str) {
    return (str1 == null || str.trim().length() == 0);
}
 


Cách #6: Khởi tạo giá trị trước khi sử dụng



Ví dụ khi bạn khai báo một Arraylist hay một mảng thì chúng ta nên khởi tạo giá trị cho nó trước khi sử dụng.



// Khởi tạo giá trị đối với ArrayList
private List<Userusers = new ArrayList<>();

// Khởi tạo giá trị đối với mảng
int[] arr = new int[length];
 


Trong đó length là số phần tử của mảng


Cách #7: Sử dụng try-catch để bắt lỗi NullPointerException

 
 


// Tránh lỗi NullPointerException bằng try catch
try {
    NPE1();
catch (NullPointerException ex) {
    System.out.println("Exception in NPE1()" + ex);
}
 


Cách #8: Sử dụng Collections.emptyList() để kiểm tra null của một collections.



Để tìm hiểu cách sử dụng Collections.emptyList() trong xử lý lỗi NullPointerException thì bạn có thể xem chi tiết tại đây.


Cách #9: Kiểm tra null-safe



Để kiểm tra null-safe bạn hãy viết code một cách khôn ngoan. Ví dụ mình có đoạn code kiểm tra độ dài của chuỗi String.


Nhưng bạn không nên code như thế này:




if (str.equals("helloworld")) {}
 


Bởi vì khi biến strnull chúng ta sẽ gặp lỗi NullPointerException đó.


Mà thay vào đó chúng ta nên code như sau:




if ("helloworld".equals(str)) {}
 


Bạn đã biết các xử lý lỗi NullPointerException trong Java chưa?



Như vậy bạn đã biết lỗi NullPointerException trong java xảy ra khi nào. Và mình cũng đã chia sẻ cho bạn một số cách để chúng ta tránh được lỗi này.


Hi vọng bài viết này giúp ích được cho bạn trong quá trình chinh phục ngôn ngữ Java này.



> Nếu bạn thực sự muốn phát triển xa hơn với ngôn ngữ Java thì nên tham gia ngay KHÓA HỌC JAVA (Fullstack). Đào tạo tập trung trong 6 tháng với giảng viên doanh nghiệp.


Hẹn gặp lại mọi người trong các bài viết sau nhé.


> Đọc thêm: Package trong Java


---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!