2012-04-16 27 views
7

Bạn thường viết gì khi bạn đang thử nghiệm cho giá trị trả lại của indexOf?Thực hành tốt nhất để kiểm tra giá trị trả lại của indexOf

if str.indexOf("a") < 0 

vs

if str.indexOf("a") == -1 

Would một phương pháp được ưa thích hơn người kia?

Tôi thực sự đang đặt câu hỏi này cho bất kỳ hàm nào bằng bất kỳ ngôn ngữ nào trả về -1 do lỗi.

Tôi thường thích cách tiếp cận < 0, bởi vì nếu hàm được mở rộng để trả về -2 trên một số trường hợp khác, mã sẽ vẫn hoạt động.

Tuy nhiên, tôi nhận thấy rằng phương pháp == -1 thường được sử dụng hơn. Có một lý do tại sao?

+1

Trong trường hợp của Java, indexOf chỉ rõ rằng nó sẽ trả về -1 nếu không tìm thấy kết quả phù hợp trong chuỗi của bạn. Do đó, việc thay đổi đó sẽ là một điểm ngắt trong API và do đó chúng tôi có thể dựa vào thực tế là nó sẽ trả về -1. Nhưng tôi cũng thích sử dụng '<0' trên' == - 1' –

+0

'nếu (! ~ Str.indexOf (" a "))' có phần ít chi tiết hơn. –

Trả lời

3

Tôi cố gắng thực hiện nguyên tắc chung để kiểm tra "điều kiện lỗi" phải càng rộng càng tốt. Do đó, tôi sẽ sử dụng < 0 thay vì == -1.

Đây là một nguyên tắc tôi đã được dạy trong các lớp học theo các phương pháp chính thức trong thời gian CS của tôi.

Trên đơn giản if nó không quan trọng quá nhiều, nhưng trên vòng điều quan trọng là phát hiện bất kỳ "ngoài phạm vi" điều kiện để đảm bảo rằng vòng lặp được chấm dứt, và không giả định rằng giá trị chấm dứt vòng lặp sẽ được nhấn chính xác.

Hãy cho ví dụ này:

i = 0; 
while (i < 10) { 
    ++i; 
    // something else increments i 
} 

v.s.

i = 0; 
while (i != 10) { 
    ++i; 
    // something else increments i 
} 

Trường hợp sau có thể không thành công - trường hợp cũ sẽ không thành công.

+0

nhưng trong trường hợp này Java API cụ thể cho chúng tôi biết -1 sẽ được trả về. – rk2010

+0

nó là, nhưng nó ngầm rằng một giá trị số nguyên của 0 hoặc cao hơn sẽ được trả về thành công, do đó, ngược lại (tức là '<0') là một thử nghiệm truy cập hoàn toàn hợp lệ. – Alnitak

+0

Nếu -2 được trả về, nó không có nghĩa là "không tìm thấy". Nó là không xác định .. bạn sẽ không mong đợi mã để tiến hành và gây ra NullPointer hoặc một số lỗi? Bằng cách đó ít nhất vấn đề JVM có thể được đưa ra ánh sáng. – rk2010

2

Tôi cũng thích cách tiếp cận < 0. Lý do tại sao phương pháp == -1 được sử dụng rộng rãi là vì thực tế là các hàm thực sự sẽ trả về -1 nếu chỉ mục bị thiếu và trường hợp "hàm mở rộng" sẽ không bao giờ xảy ra, theo tài liệu Java.

1

Trong hầu hết các trường hợp nên dính vào doc Java càng sát càng có thể. Xem Tài liệu Java: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28int%29

... theo nó: -1 sẽ được trả lại.

Vì vậy, tôi sẽ luôn kiểm tra -1. Nếu bạn có một giá trị cụ thể để kiểm tra, an toàn hơn để kiểm tra giá trị cụ thể đó, để bảo vệ chống lại các thay đổi mã trong tương lai trong java api.

Ví dụ: nếu bạn nhận được -2, điều đó có nghĩa là một số lỗi xảy ra nghiêm trọng trong JVM của bạn. Nó không có nghĩa là "không tìm thấy". Nó sẽ là tốt hơn cho mã để tiến hành và gây ra một ngoại lệ/lỗi.

0

Khi Sandeep Nair chỉ ra javaDoc giải thích nó, nhưng tôi muốn bình luận một chút.

Cả hai sẽ hoạt động tốt và tôi sẽ không nói một là "tốt hơn" khác. Lý do nhiều người viết == -1 là có quy ước chung rằng các phương thức tìm kiếm trả lại -1 nếu không tìm thấy "nội dung". Chúng tôi không thể sử dụng 0 vì chúng được sử dụng làm chỉ mục trong mảng vv.

Vì vậy, đó là vấn đề của ý kiến. Miễn là quy ước vẫn còn, nó không quan trọng.

0

Tôi muốn sử dụng -1 đơn giản chỉ vì tôi muốn kiểm tra những gì tôi đang mong đợi.

Tôi không mong đợi -2. Nếu tôi nhận được -2, điều đó có thể có nghĩa là tôi có một số vấn đề. Kiểm tra những gì bạn đang mong đợi chỉ tốt hơn là kiểm tra những gì bạn có thể mong đợi.

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