Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao tôi có NullPointerException ở đây?

Thay vì truy tìm nguyên nhân gốc rễ trong bóng tối, tôi nghĩ tốt hơn nên giải thích nguyên nhân và cách thức gây ra NPE cũng như cách tránh chúng, để OP có thể áp dụng kiến ​​thức mới có được để tìm kiếm vấn đề nhỏ nhặt của riêng mình.

Hãy xem, các tham chiếu đối tượng (các biến) có thể chứa một Object có giá trị đầy đủ hoặc đơn giản là không có gì , là null .

SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.

Bây giờ, nếu bạn đang cố gắng truy cập không có gì (null ), thì chắc chắn bạn sẽ nhận được NullPointerException , đơn giản vì null không có bất kỳ biến hoặc phương thức nào.

someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.

Giải quyết vấn đề này khá đơn giản. Về cơ bản, nó có thể được thực hiện theo hai cách:bằng cách khởi tạo nó hoặc chỉ bằng cách bỏ qua nó.

if (someObject2 == null) {
    someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!

hoặc

if (someObject2 != null) {
    someObject2.doSomething(); // No NPE anymore!
}

Trong trường hợp NPE, số dòng đầu tiên của stacktrace trỏ đến dòng chính xác mà nó được gây ra. Bạn đã nói theo nghĩa đen "dòng 272 là admin.birthList.add(list1); ". Dòng này chứa hai những nơi mà các tham chiếu đối tượng được truy cập / gọi (sử dụng dấu chấm . nhà điều hành). Đầu tiên là admin.birthList và thứ hai là birthList.add(list1) . Việc tìm hiểu xem một hoặc cả hai có gây ra NPE hay không là tùy thuộc vào bạn. Nếu đó là lệnh gọi đầu tiên thì admin chỉ đơn giản là null . Nếu đó là lời gọi thứ hai thì birthList chỉ đơn giản là null . Bạn có thể sửa nó bằng cách khởi tạo nó bằng một đối tượng đầy đủ.

Chỉnh sửa: Nếu bạn gặp khó khăn trong việc xác định nguyên nhân gốc rễ (hóa ra là từ các nhận xét), thì bạn cần phải học cách gỡ lỗi. Chạy trình gỡ lỗi hoặc chỉ thực hiện "gỡ lỗi của người nghèo" với sự trợ giúp của System.out.println() của mọi biến trước khi truy cập / gọi chúng. Đầu tiên, hãy xem dòng nơi gây ra NPE. Nếu đây là ví dụ

admin.birthList.add(list1);

thì bạn cần thay đổi nó như sau để tìm ra nguyên nhân gốc rễ:

System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);

kiểm tra xem có in null không . Ngoài ra, bạn cũng có thể làm:

if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);

bạn cũng có thể tách các lời gọi riêng lẻ qua các dòng riêng biệt để bạn có đủ số dòng để biết tham chiếu nào là null.

List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql ném cột không xác định 'mac' trong 'danh sách trường'

  2. Làm thế nào để mã cứng điều kiện ở đâu trong chế độ xem danh sách, tìm kiếm cơ bản, tìm kiếm trước trong đường CE

  3. Thuật toán tạo một số ngẫu nhiên

  4. Cách lưu chữ ký trong MySQL

  5. Cách nhận bản ghi của tháng hiện tại trong MySQL