0 Câu hỏi: Bằng cách nào đó, các đối tượng của tôi trống ngay cả khi tôi điền chúng bằng cách sử dụng một phép nối trả về một đối tượng [trùng lặp]

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Ngoại lệ con trỏ Null là gì (java.lang.NullPointerException) và nguyên nhân gây ra chúng?

Phương pháp /công cụ nào có thể được sử dụng để xác định nguyên nhân để bạn ngăn chặn ngoại lệ khiến chương trình chấm dứt sớm?

    
210
12 Câu trả lời                              12                         

Khi bạn khai báo một biến tham chiếu (nghĩa là một đối tượng), bạn thực sự đang tạo một con trỏ tới một đối tượng. Hãy xem xét đoạn mã sau nơi bạn khai báo một biến kiểu nguyên thủy int:

int x;
x = 10;

Trong ví dụ này, biến xint và Java sẽ khởi tạo nó thành 0 cho bạn. Khi bạn gán cho nó giá trị 10 trên dòng thứ hai, giá trị của bạn là 10 được ghi vào vị trí bộ nhớ được gọi bởi x.

Nhưng, khi bạn cố gắng khai báo một tham chiếu loại , một cái gì đó sẽ xảy ra. Lấy mã sau:

Integer num;
num = new Integer(10);

Dòng đầu tiên khai báo một biến có tên num, nhưng thực tế nó không chứa giá trị nguyên thủy. Thay vào đó, nó chứa một con trỏ (vì loại là Integer là loại tham chiếu). Vì bạn chưa nói phải chỉ đến cái gì, Java đặt nó thành null, có nghĩa là " Tôi đang chỉ vào nothing ".

Trong dòng thứ hai, từ khóa new được sử dụng để khởi tạo (hoặc tạo) một đối tượng loại Integer và biến con trỏ num được gán cho đối tượng 06003509911110010105062

Integer xảy ra khi bạn khai báo một biến nhưng không tạo đối tượng. Vì vậy, bạn đang chỉ đến một cái gì đó không thực sự tồn tại.

Nếu bạn cố gắng hủy đăng ký NullPointerException TRƯỚC KHI tạo đối tượng bạn nhận được num. Trong trường hợp tầm thường nhất, trình biên dịch sẽ bắt gặp sự cố và cho bạn biết rằng "NullPointerException" đối tượng.

Chẳng hạn,

bạn có thể có một phương pháp như sau:

num may not have been initialized

Trong trường hợp đó, bạn không tạo đối tượng

public void doSomething(SomeObject obj) {
   //do something to obj
}
, mà giả sử rằng nó đã được tạo trước khi phương thức obj được gọi. Lưu ý, có thể gọi phương thức như thế này: doSomething() trong p /p> Ngoài ra, có thể có trường hợp mục đích của phương thức không chỉ hoạt động trên đối tượng được truyền vào và do đó, một tham số null có thể được chấp nhận. Trong trường hợp này, bạn sẽ cần kiểm tra tham số null và hành xử khác đi. Bạn cũng nên giải thích điều này trong tài liệu. Ví dụ:
doSomething(null);
có thể được viết là: obj

Cuối cùng, Cách xác định ngoại lệ & nguyên nhân sử dụng Stack Trace

    
3526
2019-05-08 05: 11: 24Z
  1. "Cách tốt nhất để tránh loại ngoại lệ này là luôn kiểm tra null khi bạn không tự tạo đối tượng." Nếu người gọi vượt qua null, nhưng null không phải là một đối số hợp lệ cho phương thức, thì việc ném lại ngoại lệ cho người gọi là đúng vì đó là lỗi của người gọi. Âm thầm bỏ qua đầu vào không hợp lệ và không làm gì trong phương thức là lời khuyên cực kỳ tồi tệ vì nó che giấu vấn đề.
    2014-07-29 13: 32: 07Z
  2. . nơi này khó hiểu để gỡ lỗi.
2014-09-26 19: 45: 00Z
  • Có thể chụp NPE được ném bởi một ứng dụng web từ trình duyệt web không? như nó sẽ hiển thị trong nguồn trang xem từ trình duyệt web ..
    2015-04-13 14: 51: 23Z
  • Có kiểm tra xem đối tượng có bằng null không trước khi bạn gọi một phương thức trên nó hoặc thử truy cập vào một biến có thể có. Đôi khi cấu trúc mã của bạn có thể giúp tránh ngoại lệ con trỏ null. ví dụ: khi kiểm tra chuỗi đầu vào bằng chuỗi không đổi, bạn nên bắt đầu bằng chuỗi không đổi như ở đây: if ("someString" .equals (inputString)) {} //ngay cả khi inputString là null, không có ngoại lệ nào được ném. Vì vậy, có rất nhiều điều bạn có thể làm để cố gắng an toàn.
    2015-11-11 04: 39: 16Z
  • Một cách khác để tránh null trong mã của bạn là sử dụng chú thích NullPointerExceptiondoSomething(). câu trả lời sau đây có thêm thông tin về điều này. Mặc dù câu trả lời này là cụ thể về IntelliJ IDE, nhưng nó cũng có thể áp dụng cho các công cụ khác như được hiển thị từ các bình luận. (BTW Tôi không được phép chỉnh sửa câu trả lời này trực tiếp, có lẽ tác giả có thể thêm nó không?)
    2016-01-03 18: 17: 34Z
  • /**
      * @param obj An optional foo for ____. May be null, in which case 
      *  the result will be ____.
      */
    public void doSomething(SomeObject obj) {
        if(obj != null) {
           //do something
        } else {
           //do something else
        }
    }
    
    là những trường hợp ngoại lệ xảy ra khi bạn cố gắng sử dụng tham chiếu trỏ đến không có vị trí trong bộ nhớ (null) như thể nó đang tham chiếu một đối tượng. Gọi một phương thức trên tham chiếu null hoặc cố gắng truy cập vào trường tham chiếu null sẽ kích hoạt int a=b. Đây là những cách phổ biến nhất, nhưng các cách khác được liệt kê trên Integer trang javadoc.

    Có lẽ mã ví dụ nhanh nhất tôi có thể đưa ra để minh họa cho NullPointerException sẽ là:

    @Nullable

    Trên dòng đầu tiên bên trong @NotNull, tôi rõ ràng đang đặt tham chiếu NullPointerException NullPointerException bằng NullPointerException. Sau đó, tôi cố gắng xử lý tham chiếu như thể nó trỏ đến một đối tượng bằng cách gọi một phương thức trên nó. Điều này dẫn đến NullPointerException vì không có mã để thực thi tại vị trí mà tham chiếu đang trỏ.

    (Đây là một kỹ thuật, nhưng tôi nghĩ rằng nó có đề cập đến: Một tham chiếu trỏ đến null không giống như một con trỏ C trỏ đến một vị trí bộ nhớ không hợp lệ. Một con trỏ null thực sự không trỏ bất cứ nơi nào , khác biệt tinh tế so với việc chỉ đến một vị trí không hợp lệ.)

        
    834
    2017-12-25 14: 24: 54Z
    1. Tôi hiểu mọi thứ bạn đã viết ở đó, nhưng chỉ vì tôi đã mã hóa được một lúc và biết 'con trỏ' và 'tham chiếu' là gì (và null là gì là, cho vấn đề đó). Khi tôi cố gắng đi sâu vào giải thích như thế, các sinh viên của tôi nhìn tôi chao đảo, vì không có đủ nền tảng.
      2009-02-20 04: 06: 16Z
    2. @ mmr: Cảm ơn phản hồi, bạn đã đưa ra một điểm hợp lệ. Trên mạng thật khó để đánh giá ai đó đang ở đâu, và ở mức độ nào thì an toàn để bắt đầu một lời giải thích. Tôi sẽ thử sửa đổi lại lần nữa.
      2009-02-20 04: 32: 49Z
    3. . //ideone.com/dWqNm4 "rel =" nofollow noreferrer "> như thế này . Với các biến cục bộ, trình biên dịch sẽ bắt lỗi này, nhưng trong trường hợp này thì không. Có lẽ điều đó sẽ bổ sung hữu ích cho câu trả lời của bạn?
    2014-01-18 09: 28: 26Z
  • @ EJP "Một con trỏ null theo nghĩa đen là không trỏ đến bất cứ đâu ..."
    2015-06-13 03: 06: 30Z
  • @ EJP Đó chính xác là những gì đoạn đó đang chỉ ra.
    2015-08-11 10: 59: 25Z
  • nguồn đặt đây