Khi nào một câu lệnh null sẽ được sử dụng trong Java?


10

Trong một cuốn sách giáo khoa tôi đã xem qua một lớp học, nó đã được nêu, một câu lệnh có thể để trống (câu lệnh null). Câu lệnh null được định nghĩa chỉ là dấu chấm phẩy.

Nó hoàn toàn không có gì tại thời gian thực hiện. Câu lệnh null hiếm khi được sử dụng.

Là một lập trình viên có kinh nghiệm vừa phải, tôi thấy thú vị khi họ nói rằng hiếm khi được sử dụng, điều này có nghĩa là ở đâu đó, có một công dụng cho nó.

Điều gì có thể có thể là việc sử dụng một tuyên bố như vậy?

Câu trả lời:


7

Nó chủ yếu là vô dụng, nhưng có một vài nơi cần thiết. Ví dụ:

while (DoSomething());

Điều này thực thi DoSomething()phương thức cho đến khi nó trả về false. Rõ ràng điều này giả định phương pháp cũng thực hiện một số tác dụng phụ hữu ích. Nhưng câu lệnh trống, tức là dấu chấm phẩy, là bắt buộc, nếu không thì vòng lặp while sẽ bao gồm câu lệnh tiếp theo thay thế.

(Tuy nhiên, để mâu thuẫn với câu trả lời khác, for(;;) {}không một ví dụ về tuyên bố trống rỗng, kể từ khi ngoặc sau một cho khoản không chứa báo cáo, nó chỉ sử dụng dấu chấm phẩy để tách (biểu thức không bắt buộc). Xem ngữ pháp Java để biết chi tiết.)


3
+1 - đây là lần duy nhất tôi từng thấy nó thực sự được sử dụng (như đã nêu, các phần trống của câu lệnh 'for' hơi khác nhau). Sự thay đổi duy nhất tôi thực hiện là chỉ ra rằng thật khó hiểu khi đọc loại sử dụng này nếu câu lệnh null được để lại trên dòng riêng của nó, thay vì ngay sau vòng lặp while, nơi nó trông giống như một câu lệnh thông thường kẻ hủy diệt ...
Jules

12

Bạn có thể sử dụng nó khi một câu lệnh được yêu cầu về mặt cú pháp nhưng không bắt buộc về mặt ngữ nghĩa. Trường hợp phổ biến nhất là bỏ qua một trong các phần của vòng lặp for, như ví dụ này , mặc dù hầu hết mọi người thấy rằng cách sử dụng kỳ quặc và khó đọc. Giống như cuốn sách của bạn nói, nó hiếm khi được sử dụng.


Cái đó. Là một tính năng ngôn ngữ vô dụng. Tôi thà bị buộc phải đọc một cách rõ ràng sự trùng lặp hơn là phải Google "chỉ là một dấu chấm phẩy java".
Chris Cirefice

2
@ChrisCirefice Mặt khác "chỉ có một dấu chấm phẩy: khá rõ ràng những gì nó nên làm khi xem xét bạn biết ngôn ngữ vừa phải. Đó không phải là một quy tắc riêng biệt, nó chỉ là hệ quả của các quy tắc khác. Ngoài ra, nếu bạn học nó mãi mãi, vì vậy tôi sẽ nói rằng nó không thực sự là vấn đề.
Maurycy

1
Nếu cảm thấy nếu bạn thấy mình viết các vòng lặp như vậy, thì bạn đã làm sai điều gì đó.
Bassinator

Tôi có một phương pháp kiểm tra giấc ngủ mà tôi sử dụng để kiểm tra khi thiết bị hoạt động trở lại. Mã này trông khá giống như thế này: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }tất nhiên là trên các dòng riêng biệt. Tôi có thể đã viết nó như là while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, nhưng điều đó sẽ sai.
BobDalgleish

Đó không phải là tuyên bố null mà chúng ta cũng sử dụng để buộc thoát khỏi các phương thức 'void'? void method(){ //code here. If(condition){return ;}}.
Laiv

9

Tôi thích sử dụng vòng lặp while , nhưng biểu thức null cho phép bạn viết điều này:

for (;;) { thread.run(); }

Tuy nhiên, một tuyên bố null cho phép bạn viết điều này:

while(true);
{
    thread.run();
}

Mục đích chính của nó là để lãng phí thời gian của lập trình viên bảo trì kém, người đến sau bạn và tự hỏi tại sao luồng không chạy. Một tuyên bố phải theo sau một thời gian. Một mình ; là một tuyên bố. Vì vậy, khối lệnh này không thực sự là một phần của vòng lặp.

Điều đó không có nghĩa là không sử dụng tốt. Chúng chỉ là hiếm. Chúng thường trông như thế này:

{
    ;
}

Bởi vì cách này có vẻ giống như bạn muốn làm điều đó (thậm chí điều này đôi khi không đủ).

Trong hội đồng, câu lệnh null này được gọi là NOP . Trong Python, nó được gọi là pass . Trong java (và những đứa trẻ khác của c), đó là một dấu chấm phẩy như bạn đã nói, hoặc thậm chí khẳng định là đúng;

Tôi biết một vài cách sử dụng:

Ngữ nghĩa .

Có một sự khác biệt giữa một không gian trống và đặt số 0 xuống làm câu trả lời. Nó nói rõ ràng, không, tôi không quên đặt một cái gì đó ở đây. Điều này không có nghĩa là không có gì. Nó không có gì rõ ràng. Mục này bỏ trống. Đây là cách chúng tôi nhận được N / A để biên dịch.

Mẫu null

Hãy tưởng tượng một cỗ máy báo hiệu ánh sáng phức tạp và đắt tiền liên tục nhặt một bóng đèn màu từ băng chuyền, vặn nó vào một ổ cắm, bật nguồn, tháo nó ra và nhặt cái tiếp theo. Bạn có thể kiểm soát những gì điều này báo hiệu bằng màu sắc của bóng đèn bạn đặt trên thắt lưng. Tuyệt vời, giờ đây cuối cùng nó cũng hoạt động hoàn hảo, sếp của bạn muốn bạn tạo ra một cách để kiểm soát thời gian của các tín hiệu này. Anh ấy muốn thêm một khoảng cách giữa các tin nhắn. Bạn nhớ với nỗi kinh hoàng rằng nhiều bộ phận quan tâm đến thời gian của các tín hiệu này và thật đau đớn khi khiến chúng đồng bộ. Làm thế nào bạn sẽ kiểm soát thời gian mà không có điều này giữ bạn làm việc vào cuối tuần? Bạn nhìn qua một thùng bóng đèn bị cháy và nhận được một ý tưởng sáng chói, không theo nghĩa đen.

Đôi khi bạn muốn sử dụng đa hình để chỉ tắt một cái gì đó mà không phá vỡ bất cứ điều gì.

Gỡ lỗi

Khi bạn đặt một điểm dừng, bạn cần có một điểm cho điểm dừng đó. Bây giờ chắc chắn một số trình gỡ lỗi sẽ cho phép bạn đặt nó trên nẹp xoăn đóng nhưng nếu chúng không hay thì ngôn ngữ cho phép bạn buộc có một nơi để đặt ngay cả khi nơi đó không làm gì cả.

Không thực sự là một điều java nhưng cũng có:

Nhiễu nhị phân

Hướng dẫn lắp ráp NOP cho phép đấu tranh với tệp thực thi nhị phân được biên dịch. Nhưng các trình biên dịch java hiện đại tối ưu hóa quá nhiều. Tôi không chắc dấu chấm phẩy không chỉ gặp sự cố. Nhưng vào thời xưa, chúng ta cũng đã sử dụng những điểm trống này trong tệp thực thi để kiểm soát thời gian hoặc cho phép chúng ta thả vào một cái móc sau đó. Nếu không có NOP thì sẽ có hướng dẫn thực tế ở đó, vì vậy nếu bạn muốn hook, bạn phải sao chép các hướng dẫn đó ở nơi khác để nhường chỗ cho hook. Điều này cũng hoạt động tốt trong ngôn ngữ c mà Java nhận được nhiều cú pháp của nó. Nhưng tôi không nghĩ rằng vấn đề móc nối này xảy ra nhiều trong Java. Chúng tôi sử dụng lập trình hướng đối tượng để làm điều đó.


2
Điều này có vẻ như mô phạm, nhưng ví dụ với forkhông phải là câu lệnh null. Các câu lệnh Null (còn gọi là các câu lệnh rỗng) có thể xảy ra ở cùng một nơi mà các câu lệnh khác (như một if) có thể xảy ra, nhưng các dấu ngoặc đơn sau đây forkhông cho phép các câu lệnh giữa các dấu chấm phẩy, mà chỉ có một bộ khởi tạo và hai biểu thức, là tùy chọn. Vì vậy, nó là một cách sử dụng dấu chấm phẩy khác với cách kết thúc thống kê. Một tuyên bố trống sẽ là dấu chấm phẩy cuối cùng trongfor(;;);
JacquesB

Bạn nói đúng, điều này có vẻ mô phạm: P. Tốt, xin lưu ý chỉnh sửa của tôi.
candied_orange

-7

Tôi sử dụng nó bởi vì Java được thiết kế theo cách không phù hợp với ngôn ngữ của con người. Điều tương tự cũng đúng với C.

Một tuyên bố là statement;.

Một câu lệnh if-then-other là if (condition) statement; else statement;

Một câu lệnh if-then-other với các khối ghép là if (condition) {statements} else {statements}

Điều này rõ ràng là vô nghĩa.

Tôi theo if (condition) {statements} else {statements};đó viết đó là hợp lý và hợp lý.

Nếu các nhà thiết kế của Java muốn coi điều này như thể sau đó là một câu lệnh null, thì tôi ổn với điều đó. Nếu nó làm cho họ hạnh phúc, hãy để nó làm cho họ hạnh phúc.


Đó là if (condition) {statements;} else {statements;}. Ngoài ra, Java khá nhất quán về việc không cần ;s sau }. Kiểu như ngôn ngữ của con người thường không gắn một khoảng thời gian ở cuối câu đã kết thúc bằng dấu chấm hỏi. (Chắc chắn, có !?hoặc ?!kết thúc, nhưng đó chỉ là xấp xỉ của , ký tự interrobang .)
8bittree

1
Chúa ơi !! o_O
Áxel Costas Pena 23/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.