2012-07-17 33 views
9

Tôi đang viết một ứng dụng Android mà làm rất nhiều thứ. Gần đây tôi đã tái cấu trúc mã của mình để có cấu trúc tốt hơn, nhưng đột nhiên tôi nhận được một vấn đề rất lạ.IF tuyên bố chỉ là không làm việc

handleRequest(String str) 
{ 
    boolean foo = executeCommand(str); 
    this.publishProgress("FOO1: " + foo); 

    if (foo == false); 
    { 
     this.publishProgress("FOO2: " + foo); 
     sendString("Failed to execute: " + str); 
    } 

    this.publishProgress("FOO3: " + foo); 
    sendEOM(); 
} 

Đoạn mã trên phải thực thi lệnh và lưu 'foo' nếu lệnh được thực hiện đúng. Mã này nằm bên trong một AsyncTask của Android (thread) vì vậy tôi sử dụng 'publishProgress' để hiển thị một bánh mì nướng.

Tôi đã lật qua trình gỡ lỗi và FOO là đúng! Các bánh mì nướng cho thấy FOO là đúng toàn bộ con đường thông qua là tốt. Tuy nhiên, nó đi trước và nhảy vào bên trong khối IF và thực hiện điều đó. Tôi chưa bao giờ thấy điều này trước đây, tôi nghĩ rằng đó là một vấn đề với Java. Tôi đã bước mặc dù các chức năng 'executeCommand' và có vẻ như nó là bỏ qua báo cáo trở lại quá.

Tôi đã chạy mã trên thiết bị ảo và thiết bị thực và cả hai đều thực hiện điều này.

Bất kỳ ý tưởng nào? Tôi hoàn toàn thua lỗ ở đây.

+0

loại bỏ các dấu chấm phẩy sau câu lệnh if –

+1

Không vấn đề của bạn, nhưng sạch hơn và rõ ràng hơn để sử dụng 'if (! Foo)' để thay thế. – dimo414

+0

@ dimo414 Phải, tôi đã cảm thấy thất vọng bởi thời gian tôi đăng bài này, vì vậy tôi đã thay đổi nó thành "FOO == FALSE" chỉ để nó được như vậy explict tôi không thể nhìn thấy bất cứ điều gì sai trái. – yellow

Trả lời

22

Bạn nói

if (foo == false); 

loại bỏ các dấu chấm phẩy, nó phải là

if (foo == false) {//your code} 
+2

Oh người đàn ông, tôi cảm thấy như một thằng ngốc. Tôi không thể tin rằng bỏ lỡ dấu chấm phẩy đó! Tôi đã dành rất nhiều thời gian gỡ lỗi 'executeCommand' để suy nghĩ vấn đề đã lên đó ... Dù sao, cảm ơn vì đã phát hiện ra điều đó đối với tôi! – yellow

9

Tháo dấu chấm phẩy: if (foo == false); ->if (foo == false)

9

Bạn đặt một dấu chấm phẩy sau if tuyên bố.

Bằng cách đó, báo cáo if của bạn tự có, và khối mã sau luôn chạy.

Sửa đổi mã của bạn như thế này:

handleRequest(String str) { 
    boolean foo = executeCommand(str); 
    this.publishProgress("FOO1: " + foo); 

    if (foo == false) { 
     this.publishProgress("FOO2: " + foo); 
     sendString("Failed to execute: " + str); 
    } 

    this.publishProgress("FOO3: " + foo); 
    sendEOM(); 
} 

N.B.
Giữ niềng răng mở của bạn trong cùng một dòng với định nghĩa chức năng/điều kiện vòng lặp làm cho những loại lỗi này ít thường xuyên hơn, IMO.

4

Sẽ không có ";" dấu chấm phẩy sau nếu câu lệnh.

Vì vậy, thay vì nếu (foo == false); nó nên nếu (foo == false){}

1

Tôi không biết làm thế nào dòng này biên dịch if (foo == false);, nhưng rõ ràng nó. Bạn cần phải loại bỏ dấu chấm phẩy ở cuối dòng như những người khác đã đề cập. Với; nó có nghĩa là không làm gì nếu foo là sai. Sau đó chương trình đi vào khối tiếp theo giữa hai dấu ngoặc nhọn. Bạn cần phải cài đặt findbugs hoặc PMD để cảnh báo chống lại loại lỗi chính tả này.

2

Nếu bạn viết dấu chấm phẩy (;) sau nếu câu lệnh kết thúc nếu điều kiện ở đó! bạn cần để bắt đầu một khối mã sau bằng văn bản nếu tình trạng ví dụ

if(foo == false){ 

// block of Code 

} //end of if condition 
Các vấn đề liên quan