2011-09-27 30 views
6

Tôi nghĩ điều xấu sẽ xảy ra khi tôi kết thúc một dòng như thế này. Nhưng trình biên dịch thậm chí không phàn nàn. Có ai có một ý tưởng, tại sao điều này là hợp pháp trong java.Trình biên dịch không phàn nàn khi tôi kết thúc một dòng với hai dấu chấm phẩy. Tại sao?

displayDataMap.put("dateInterval", getDateInterval());;

Sửa: Lý do Eclipse đã không phàn nàn là bởi vì trong preference->java->compiler->Errors/Warning tôi đã báo cáo kết quả rỗng: như bỏ qua.

enter image description here

+2

Bạn có tham khảo Đặc điểm ngôn ngữ không? Nếu không, tai sao không? – Ingo

+1

Tôi đã kiểm tra liên kết sau đây để biết đặc tả ngôn ngữ, nhưng tìm kiếm lướt qua của tôi không tạo ra bất cứ điều gì. Bạn có một liên kết mà tôi có thể nhìn? http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html – pacman

+1

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 – Ingo

Trả lời

10

Đây là tuyên bố trống và hợp lệ. Như được chỉ ra bởi jwodder, chính xác hơn câu lệnh trống là thiếu tuyên bố giữa hai dấu chấm phẩy và có thể được biểu diễn bằng hai dấu chấm phẩy liên tiếp hoặc bằng dấu chấm phẩy được phân tách bằng dấu cách trắng (bao gồm các dòng mới).

IDE như Eclipse sẽ cảnh báo bạn về việc này. Nếu bạn kiểm tra hình ảnh dưới đây, tôi đã chèn một dấu chấm phẩy đôi trên dòng 236. Các dòng màu đỏ đã được thêm vào bởi tôi để tập trung sự chú ý, nhưng Eclipse cung cấp nhiều dấu hiệu trực quan:

  • một dòng màu vàng lởm chởm dưới dấu chấm phẩy .
  • một bóng đèn với một dấu hiệu cảnh báo về lề trái của dòng 236, bằng cách di trên dòng đó, nó sẽ bật lên một thông điệp nhỏ nói "dấu chấm phẩy không cần thiết".
  • trên thanh chứa các thư mục và gói, dấu hiệu cảnh báo sẽ hiển thị lại. Nó được hiển thị cho mọi gói hoặc thư mục nguồn, chứa ít nhất một cảnh báo.
  • trên trình thám hiểm gói và trên biểu tượng tệp điều hướng cùng biểu tượng bóng đèn sẽ được hiển thị (không có trong ảnh chụp màn hình này).

enter image description here

+1

Cụ thể, sự trống rỗng giữa hai dấu chấm phẩy là một câu lệnh trống. – jwodder

+3

Và nó là để tránh, bởi vì trình biên dịch chèn 10000 NOPs trong bytecode cho mỗi tuyên bố trống .... không, chỉ đùa :) – Ingo

+1

@stivlo. Cảm ơn câu trả lời. Tôi đã thử nghiệm bằng cách sử dụng phiên bản Eclipse Indigo và Helios và cả hai đều không phàn nàn. – pacman

2

Trình biên dịch sử dụng dấu chấm phẩy để biểu thị một 'kết thúc tuyên bố'. Có hai liên tiếp kết thúc câu lệnh trước câu lệnh đầu tiên và sau đó tạo một câu lệnh trống thứ hai.

Thực sự, bạn thậm chí có thể làm điều này:

displayDataMap.put("dateInterval", getDateInterval());;;;;;;;;;;;;;; 
0

trình biên dịch sẽ không phàn nàn ngay cả khi bạn chỉ cần tạo một tập tin rỗng với phần mở rộng java. Một đơn vị biên dịch trống và giá trị hợp lệ của nó. Tương tự, dấu chấm phẩy là một câu lệnh trống có giá trị.

1

; có nghĩa là kết thúc tuyên bố.

cho ;; , ; thứ hai sẽ ngụ ý rằng câu lệnh không bao gồm gì cả.

1

Đây là một tuyên bố trống rỗng, nó giống như là nếu bạn đã làm điều này:

int x = 0; 
; 

Không có vấn đề đó!

2

Dưới đây là một ví dụ thực tế trong C:

#ifndef NDEBUG 
#define Dprintf printf 
#else 
#define Dprintf(X) 
#endif 

if(some_test) 
    Dprintf("It's true!"); 
else 
    Dprintf("It's false."); 

Nếu NDEBUG được xác định, trình biên dịch sẽ thấy:

if(some_test) 
    ; 
else 
    ; 

Điều này có thể hữu ích trong một số trường hợp.

Vì Java được lấy cảm hứng từ C/C++, đó là thứ họ giữ, mặc dù nó không hữu ích và không có bộ tiền xử lý.

Bạn có thể, nếu bạn muốn, hãy chạy bộ tiền xử lý C cpp trên mã của bạn để thực hiện loại hành vi này.

Một số ngôn ngữ có thể nói đó là lỗi thay vào đó, tùy thuộc vào lựa chọn của họ.

+0

Thật hữu ích khi xem tại sao một câu lệnh ';;;;' hợp lệ trong Java. Có lẽ chúng ta sẽ không bao giờ biết chắc chắn 100%. Bây giờ câu hỏi trở thành mặc dù: điều này sẽ thay đổi và trở thành không hợp lệ? – anon58192932

+0

Tôi không nghĩ rằng nó sẽ thay đổi - và hầu hết mọi người sử dụng cùng một trình biên dịch JavaC từ Oracle. Ngay cả khi nó không bao giờ, nó là một điều rất đơn giản để cập nhật, chỉ cần gọi một regex trên tất cả các tập tin của bạn như s /; {2,} /;/g – wormsparty

2

; đại diện cho câu lệnh trống hoặc bạn có thể nói, nó đại diện cho dòng chấm dứt của bất kỳ câu lệnh nào trong Java, ngay cả khi bạn đặt nhiều câu lệnh hợp lệ trong Java. Trình biên dịch sẽ không cung cấp cho bạn bất kỳ lỗi nào vì điều này là hợp lệ. thậm chí tuyên bố bên dưới cũng hợp lệ:

System.out.println("HI");;;;;;;; 
+0

Cảm ơn, để chỉnh sửa các tuyên bố trên. – subodh

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