Tại sao vòng lặp nâng cao không thực hiện kiểm tra null trước khi lặp qua bộ sưu tập.Tại sao tăng cường cho vòng lặp không thực hiện việc kiểm tra null
Trả lời
Nếu bạn có ý nghĩa rằng điều này sẽ đi tiếng vang lớn:
int[] array = null;
for (int x : array) {
}
... sau đó tôi nghĩ rằng nó hoàn toàn thích hợp cho điều đó để ném một NullPointerException
. Cách thay thế sẽ là để nó âm thầm nuốt null, và coi nó tương đương với một mảng trống. Đó không phải là cách tiếp cận mà Java thực hiện ở bất kỳ nơi nào khác - tại sao điều này lại khác? Nó sẽ làm cho ngôn ngữ không nhất quán.
Một nơi tôi muốn có là xử lý nhiều hơn (nhưng xử lý rõ ràng) đang bật enum - sẽ tốt hơn nếu có thể cung cấp trường hợp rỗng, để tránh kiểm tra giá trị đặc biệt đó trước. Nhưng đó là một cấu trúc rất khác, đặc biệt là cố gắng thực hiện các hành động khác nhau cho các giá trị khác nhau.
Một trường hợp 'null' để bật enums là một điều thú vị ý tưởng, nhưng những gì sẽ xảy ra nếu bạn có một 'mặc định:' nhưng không rõ ràng 'trường hợp null:' và giá trị enum là 'null'. Nếu 'null' đi đến trường hợp mặc định phá vỡ khả năng tương thích ngược, và là xấu nếu' null' là một giá trị sai. Nếu bạn nhận được một NPE, thì 'mặc định' là hành xử theo cách không phù hợp về ngữ nghĩa. (Nó bây giờ có nghĩa là "mặc định trừ khi nó rỗng ...") –
@Stephen C: Câu hỏi hay. Tôi không chắc rằng đó là một ý tưởng hay để giới thiệu nó * bây giờ *, nhưng tôi nghĩ rằng nó sẽ được tốt đẹp để xem xét khi tính năng được giới thiệu lần đầu tiên. –
Tôi nghĩ rằng có đủ "nếp nhăn" mà nó sẽ (giả thuyết) đã là một ý tưởng tồi ngay cả sau đó. Có lẽ nếu Java 1.0 cũng đã có tyo nullable ... –
Tôi sợ phải chống lại Jon Skeet ...: | ... Nhưng những gì một địa ngục ... bạn nghĩ gì về tình huống này ?:
'
findMoney(List<Places> places){
int money = 0;
for(Place place : places){
money += searchWithCare(place);
}
return money;
}
'
Nếu tôi hỏi một số khách hàng để cho tôi biết nơi để tìm kiếm và ông nói với tôi không có gì. Bạn có nghĩ là tốt hơn ở đây để ném một NullPointerException? Có thể quản lý cuộc gọi đến phương pháp này vì vậy nếu tham số là null không gọi nó? .... Tôi nghĩ rằng trả về 0 là một phản ứng nhất quán vì không có lỗi ở đây. Tôi tin rằng Ngoại lệ được thực hiện để quản lý luồng mã và tôi không thấy lý do tại sao tôi nên thay đổi luồng trong loại tình huống này. Trả lại một cero hoặc thậm chí một null có thể là một phản ứng tốt, nó không thể được?
Vậy còn giải pháp này thì sao? '
findMoney(List<Places> places){
int money = 0;
for(Place place : places == null ?Collections.<Place>emptyList():places){
money += searchWithCare(place);
}
return money;
}
'
Điều này thực sự hữu ích. Tôi chưa bao giờ thấy 'Bộ sưu tập.
Tôi đã cố gắng tìm nó! Tôi không thể ... nó là một ... bí mật? :) Xin lỗi –
Ồ, cảm ơn bạn đã thử. Đó là thân nhân khó tìm kiếm. –
Mã này phải như thế này:
for (AnyObject anyObject : checkIsEmpty(anyObjectList)) {
System.out.println(anyObject.doSomething());
}
private <T> Iterable<T> checkIsEmpty(Iterable<T> iterable) {
return iterable == null ? Collections.<T>emptyList() : iterable;
}
- 1. Thực hiện tốt việc học tăng cường?
- 2. Java tăng cường cho vòng lặp VS .NET foreach loop
- 3. Tăng cường cho vòng lặp trong mảng 2D - JavaScript
- 4. Tăng cường đối với ngoại lệ vòng lặp
- 5. Tăng cường việc sử dụng
- 6. cách tăng cường multi_index được thực hiện
- 7. Kiểm tra vòng lặp Mocha?
- 8. Đơn vị kiểm tra và tăng cường :: asio
- 9. cho vòng lặp, tăng thêm gấp đôi
- 10. Hành vi lạ trong Javascript được tăng cường cho ... trong vòng lặp
- 11. Tại sao không có tăng cường :: filesystem :: move_file?
- 12. Kiểm tra Tăng cường: Cách viết các trường hợp kiểm tra được tham số
- 13. Tại sao phải kiểm tra xem (* argv == NULL)?
- 14. trong khi vòng lặp không kiểm tra tình trạng
- 15. Vòng lặp thực hiện nối
- 16. Các trình lặp vòng lặp cho C++
- 17. Thực hiện `kiểm tra` hoặc 'thực hiện kiểm tra'
- 18. Tăng cho vòng 2 tại Scala
- 19. Kiểm tra để khẳng định trong khung kiểm tra Tăng cường
- 20. Thực hiện bất kỳ việc tăng cường nào :: asio async gọi tự động hết giờ?
- 21. Vòng lặp với StateT: Tại sao vòng lặp này không lặp lại
- 22. javascript kiểm tra không null
- 23. Tại sao C# cho phép điều này? (Null kiểm tra để int)
- 24. Có thể tăng/giảm vòng lặp cho nhiều lần không?
- 25. Tại sao Scala "cho hiểu vòng lặp" rất chậm so với FOR vòng?
- 26. danh sách vòng lặp không gia tăng
- 27. Kiểm tra vòng lặp nếu trên lần lặp cuối cùng?
- 28. Tăng cường triển khai Mutex cho Windows
- 29. Tại sao vòng lặp 'cho (;;)' này lại là?
- 30. Tại sao Java không cho phép foreach trên các trình vòng lặp (chỉ trên các vòng lặp)?
bạn có thể chỉ định một số chi tiết về mã của bạn và những gì bạn đang làm? –
Tôi hình dung câu hỏi là tại sao 'for (X y: (List) null) {...}' đang ném một NPE ... –
trùng lặp của http://stackoverflow.com/questions/2250031 –