2017-06-19 23 views
49

Khi nhìn vào các mã nguồn cho Integer.parseInt(String s, int radix) (java 8, 1.8.0_131), tôi thấy khối bình luận sau:Tại sao parseInt cảnh báo của việc sử dụng valueOf

/* 
* WARNING: This method may be invoked early during VM initialization 
* before IntegerCache is initialized. Care must be taken to not use 
* the valueOf method. 
*/ 

Trong khi tôi hiểu được một phần đầu tiên về IntegerCache , Tôi không hiểu tại sao có cảnh báo về valueOf và lý do tại sao trong ngữ cảnh này.

Tôi thấy rằng valueOf() dựa trên parseInt(), nhưng tôi vẫn không hiểu tại sao có cảnh báo này.

Ai đó có thể giải thích chính xác nhận xét cảnh báo tôi về điều gì (và ngữ cảnh không nên sử dụng valueOf) và điều gì có thể xảy ra sai.

Edit:

Các mã trong Integer.valueOf (int i) dường như đã thay đổi kể từ khi câu hỏi khác từ bình luận dưới đây được yêu cầu, nó bây giờ là

public static Integer valueOf(int i) { 
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
     return IntegerCache.cache[i + (-IntegerCache.low)]; 
    return new Integer(i); 
} 

và cần được lưu từ lỗi xác nhận trước.

+1

Có thể trùng lặp [Tại sao xác nhận được sử dụng trong phương thức Integer.valueOf của lớp Integer?] (Https://stackoverflow.com/questions/33891156/why-is-assert-used-in-the-integer- valueof-method-of-the-integer-class) – Blasanka

+1

khẳng định dường như không được sử dụng trong java8 Integer.valueOf() @Blasanka, bạn có thể giải thích phiếu bầu trùng lặp được không, hoặc chỉ cho tôi mã mà vẫn bằng mã được liên kết trong mục tiêu dupe? – Michael

Trả lời

53

Ai đó có thể giải thích chính xác nhận xét cảnh báo tôi (và ngữ cảnh không sử dụng valueOf) và điều gì có thể xảy ra sai.

Lớp Integer tạo và duy trì bộ nhớ cache Integer đối tượng đại diện cho các giá trị nguyên nhỏ; theo mặc định, các giá trị trong phạm vi từ -128 đến 127 được bao phủ (thảo luận thêm here, here và nhiều vị trí khác). Integer.valueOf() sẽ trả về một đối tượng từ bộ nhớ cache này khi đối số của nó đại diện cho một số trong phạm vi. Nhận xét cảnh báo rằng parseInt() không được dựa trên valueOf() vì trước đây có thể được gọi trước khi bộ nhớ cache được điền.

Các hành vi sai trái mà có thể được dự kiến ​​trong trường hợp đó không được chỉ định, và hình dung có thể khác nhau giữa các phiên bản Java, nhưng khả năng đáng tin cậy là rằng null sẽ được trả lại hay một ngoại lệ (NullPointerException, IndexOutOfBoundsException, ...) sẽ được ném ra.

Trong mọi trường hợp, đây là nhận xét nội bộ trong quá trình triển khai, không phải là nhận xét cho người dùng thuộc lớp Integer. Vào thời điểm bất kỳ mã người dùng nào chạy, việc khởi tạo bộ nhớ cache cần thiết hoàn tất và có thể dựa vào Integer.valueOf() để hoạt động hoàn toàn như mô tả its API documentation.

36

Mã nguồn là (gần như) chỉ để tham khảo, javadoc không chứa cảnh báo đó vì nó chỉ dành cho các nhà phát triển Java.

Đây có thể là một cảnh báo vì có sự cố hoặc lỗi do ai đó sử dụng phương pháp valueOf để mã phương thức parseInt có thể được gọi trước khi bộ nhớ cache nội bộ được khởi tạo.

Nói cách khác, cảnh báo đó không dành cho bạn, giả sử bạn không thay đổi lớp Integer!

+1

cảm ơn, BTW câu hỏi hay - đã không nhận thức được cảnh báo đó –

+0

Tôi khá bối rối khi đọc nó ...: D – Michael

+0

Nếu bạn đang phân lớp Integer, đây chắc chắn là điều bạn cần biết. –

Các vấn đề liên quan