2010-10-21 33 views
18

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

+1

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? –

+1

Tôi hình dung câu hỏi là tại sao 'for (X y: (List ) null) {...}' đang ném một NPE ... –

+0

trùng lặp của http://stackoverflow.com/questions/2250031 –

Trả lời

31

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ó 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.

+3

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 ...") –

+1

@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. –

+0

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 ... –

5

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; 
} 

'

+0

Điều này thực sự hữu ích. Tôi chưa bao giờ thấy 'Bộ sưu tập. emptyList() 'thành ngữ trước đây. Tôi đã mong đợi nó sẽ là 'Collections.emptyList () 'nếu bạn có thể làm điều đó, nhưng dường như không. Bạn có biết thành ngữ này được ghi chép ở đâu không? Tôi đang gặp khó khăn khi tìm nó. –

+0

Tôi đã cố gắng tìm nó! Tôi không thể ... nó là một ... bí mật? :) Xin lỗi –

+0

Ồ, cảm ơn bạn đã thử. Đó là thân nhân khó tìm kiếm. –

1

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; 
} 
Các vấn đề liên quan