2013-07-26 18 views
16

Tôi đang sử dụng nhật thực và lập trình bằng java. Đôi khi tôi đi qua một nullPointerException rằng sẽ bệnh dịch tôi trong nhiều giờ. Có anyway để gỡ lỗi nullPointerExceptions tốt hơn và tìm ra những gì các giá trị biến và những thứ khác mà có thể gây ra ngoại lệ con trỏ null.Cách tốt để gỡ lỗi nullPointerException

+2

nhìn vào vết đống ... nó cho thấy những gì dòng ném NPE và bạn có thể đặt một break point và xem biến nào là null ... – chancea

+0

Cách tốt nhất để tìm hiểu cách gỡ lỗi NPE là tiếp tục gỡ lỗi chúng. Bạn sẽ nhận được tốt hơn vào nó với thời gian. Nhưng điều quan trọng là để tìm ra nơi nó xảy ra và sau đó kiểm tra các biến. Không có phép thuật ở đây. –

+1

Bạn có thể đặt các câu lệnh 'assert' vào mã của mình – MadProgrammer

Trả lời

22

Nhìn vào dấu vết ngăn xếp và đọc số dòng nơi đặt NullPointerException. Hầu như mọi khi, dòng có một số phương pháp gọi như

x.getValue() 

Nếu xnull, bạn nhận được một NullPointerException. Nếu phương thức ở trên cùng của dấu vết ngăn xếp không phải là mã của bạn, hãy theo dõi ngăn xếp tất cả cách quay lại cho đến khi bạn tiếp cận mã của mình. Rất thường xuyên trong trường hợp này, bạn đang đi qua null đến một phương thức không thích thông số null. Tìm nó và sửa nó.

Ngoài ra, rất thường xuyên khi bạn gặp phải một phương pháp không phải của bạn mà đang ném một NullPointerException, hãy đọc tài liệu. Ví dụ, nhìn vào String.replace(CharSequence target, CharSequence replacement):

Ném:

NullPointerException - nếu target hoặc replacementnull.

Nó không rõ ràng hơn thế!

Dưới đây là một ví dụ:

enter image description here

Nhìn vào dòng 4, chúng ta thấy foo.bar(). Điều này ngụ ý rằng foonull. Điều đó thật dễ dàng. Hãy xem xét một ví dụ khác:

enter image description here

Tracing trở lại mã của bạn, chúng ta thấy rằng s.replace(target, replacement) được ném. Chúng tôi nên kiểm tra targetreplacement. Hãy đính kèm trình gỡ lỗi:

enter image description here

Aha! replacementnull. Bạn có thể làm điều tương tự trong Eclipse. Đặt điểm ngắt cho khi một ngoại lệ được ném và sử dụng nó để kiểm tra các tham số cho phương thức của bạn. Tôi nguyên thủy ở đây bởi vì tôi đến từ một trường học tư tưởng, nơi tôi thực sự tin rằng mọi người sẽ tốt hơn nếu họ học cách làm điều đó một cách khó khăn trước tiên. Rối loạn trừu tượng và tất cả những điều đó.

+2

Một ví dụ hoặc một ảnh chụp màn hình với vòng tròn tự do sẽ là tốt đẹp :) – hexafraction

+1

Vấn đề của tôi là với một hàm giống như hàm (a, b, c, d, e) nó không cho bạn biết biến nào trong số đó là null. –

+2

@hexafraction: hoặc thậm chí tốt hơn, 8x10 trong hình ảnh bóng với vòng tròn và mũi tên và một đoạn trên mặt sau của mỗi người giải thích những gì từng người sẽ được sử dụng. –

4

Có một vài cách để làm cho NullPointerException ít của một vấn đề:

  1. Sử dụng @Nullable annotation.

  2. Kiểm tra giá trị của các đối số cho null trong các hàm tạo và các bộ định tuyến (tránh các bộ định vị trong mã Java cũ đơn giản). Nếu bạn làm điều này rất nhiều, bạn có thể tạo một mẫu mã nguồn (Eclipse) để nhanh chóng tạo mã.Điều này được gọi là "failfast" - bạn không chờ đợi ngoại lệ được ném khi giá trị đang được sử dụng thêm trong mã, ví dụ: sau khi lưu trữ nó trong một lĩnh vực.

  3. Đảm bảo rằng bạn thực hiện số tiền tối thiểu (ví dụ: 1 hoặc 2) hoạt động trên mỗi dòng. Nếu bạn không, bạn sẽ phải tìm ra nơi trong biểu thức dòng đơn NullPointerException xảy ra.

  4. Không sử dụng null trong các trường để chỉ trạng thái. Thay vào đó, hãy sử dụng ví dụ: an enum State. Ví dụ. không làm if (socket == null) { // not connected } vì dễ dàng quên kiểm tra null sau này. Một trạng thái rõ ràng không phải là dễ dàng để quên.

  5. Không khởi tạo biến cục bộ thành null trừ khi cần thiết. Trên thực tế, nếu bạn xử lý phạm vi và ngoại lệ của mình một cách chính xác, bạn sẽ có thể đánh dấu hầu hết các biến final. Thay thế các phương thức mặc định printStacktrace() bằng throw new IllegalStateException("Unhandled program state", e) giúp bởi vì nó được xem như là một điểm thoát của một khối mã.

Sau nhiều chương trình, bạn sẽ tìm thấy số lượng NullPointerException giây.

17
  1. Trong khi gỡ lỗi, bạn có thể sử dụng chế độ xem BreakPoints để nắm bắt các con trỏ rỗng .

    Window -> Show View -> breakpoint

    Trong giao diện có một "J!" cho phép bạn đặt breakpoint trên trường hợp ngoại lệ. Bạn có thể đặt java.lang.NullPointerException. Vì vậy, khi một trường hợp ngoại lệ con trỏ null bị ném ra, bạn có thể kiểm tra biến nào đang gây ra null.

  2. Điều khác bạn có thể làm là nắm bắt khả năng truy cập con trỏ null trong khi bạn đang mã hóa. Off-khóa bạn không thể nắm bắt tất cả các Null Con trỏ bằng cách sử dụng cài đặt này. Nhưng vẫn hữu ích, thiết lập các cài đặt sau trong nhật thực của bạn.

    Preferences -> Java -> Compiler -> lỗi/cảnh báo -> phân tích Null