Java에서 null 문은 언제 사용됩니까?


10

내가 클래스를 찾고있는 교과서에서 진술은 비어있을 수 있습니다 (널 진술). null 문은 세미콜론으로 정의됩니다.

실행 시간에는 전혀 아무것도하지 않습니다. null 문은 거의 사용되지 않습니다.

적당히 경험이 풍부한 프로그래머로서, 나는 거의 사용 하지 않는다고 말하는 것이 흥미 롭습니다 .

그러한 진술을 어떻게 사용할 수 있습니까?

답변:


7

그것은 거의 쓸모가 없지만 필요한 곳이 몇 군데 있습니다. 예를 들면 다음과 같습니다.

while (DoSomething());

이 DoSomething()메소드는 false를 리턴 할 때까지 메소드를 실행합니다 . 분명히 이것은 방법이 유용한 부작용을 수행한다고 가정합니다. 그러나 빈 명령문, 즉 후미 세미콜론이 필요합니다. 그렇지 않으면 while 루프에는 다음 다음 명령문이 대신 포함됩니다.

(그러나, 다른 답변을 모순 for(;;) {}입니다 하지 A는 문을 포함하지 않는 절 위해, 그냥 (선택 사항) 표현식을 분리하는 세미콜론을 사용 후 괄호 때문에, 빈 문장의 예. 참조 자바 문법에 대한 자세한 내용입니다.)


3
+1-이것이 실제로 사용 된 것을 본 유일한 시간입니다 ( 'for'문의 빈 섹션은 약간 다릅니다). 내가 할 유일한 변경 사항은 null 문이 while 루프 바로 다음이 아닌 자체 줄에 남아 있으면 일반적인 문처럼 보이는 경우이 종류의 사용을 읽는 것이 혼란 스럽다는 것입니다. 터미네이터 ...
— Jules

12

명령문이 구문 적으로 필요하지만 의미 적으로 필요하지 않은 경우에 사용할 수 있습니다. 가장 일반적인 경우는 이 예제 와 같이 for 루프의 일부 중 하나를 생략하는 것입니다. 대부분의 사람들은 사용법이 이상하고 읽기가 어렵다는 것을 알고 있습니다. 책에서 말하는 것처럼 거의 사용되지 않습니다.


그. 쓸모없는 언어 기능입니다. 차라리 구글에 "세미콜론 자바"보다 중복을 명시 적으로 읽어야한다.
— Chris Cirefice

2
@ChrisCirefice 반면에 "세미콜론 만 : 언어를 적당히 알고 있다는 것을 고려할 때해야 할 일이 분명합니다. 별도의 규칙이 아니라 다른 규칙의 결과 일뿐입니다. 정말 문제가되지는 않습니다
— Maurycy

1
만약 당신이 그런 루프를 작성하고 있다고 느끼면 뭔가 잘못하고있는 것입니다.
— Bassinator

장치가 온라인 상태가 될 때 확인하는 데 사용하는 수면 폴링 방법이 있습니다. 코드는 다음과 같이 보입니다 : while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }물론 모두 별도의 줄에 있습니다. 나는로 쓸 수 있었지만 그것은 while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }잘못되었을 것입니다.
— BobDalgleish

'void'메서드를 강제 종료하기 위해 사용하는 것은 null 문이 아닙니다. void method(){ //code here. If(condition){return ;}}.
— Laiv

9

while 루프 사용을 선호 하지만 null 식을 사용하면 다음과 같이 작성할 수 있습니다.

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

그러나 널 문장으로 작성해 보자.

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

그 주요 목적은 당신을 뒤 따르고 왜 스레드가 작동하지 않는지 궁금한 유지 보수 프로그래머의 시간을 낭비하는 것입니다. 성명서는 반드시 한동안 따라야합니다. 고독한; 진술입니다. 따라서이 문장 블록은 실제로 루프의 일부가 아닙니다.

좋은 사용법이 없다고 말하는 것은 아닙니다. 그들은 아주 드 rare니다. 그들은 보통 다음과 같이 보입니다 :

{
    ;
}

이런 식으로 당신이 그것을 의미하는 것처럼 보이기 때문에 (때로는 충분하지 않음).

어셈블리에서이 널 명령문을 NOP 라고합니다 . 파이썬에서는 이것을 pass 라고 부릅니다 . 자바 (및 c의 다른 자식들)에서 그것은 당신이 말했듯이 세미콜론이거나 심지어 진실이라고 주장합니다.

몇 가지 용도를 알고 있습니다.

시맨틱 .

빈 공간과 대답으로 0을 내리는 것에는 차이가 있습니다. 분명히 여기에 무언가를 넣는 것을 잊지 않았습니다. 이것은 아무것도 아닙니다. 명백한 아무것도 아닙니다. 이 공간은 의도적으로 비워 두었습니다. 이것이 N / A를 컴파일하는 방법입니다.

널 패턴

컨베이어 벨트에서 컬러 전구를 반복해서 집어 들고 소켓에 끼 우고 전원을 켜고 제거한 다음 다음 것을 집어 올리는 복잡하고 고가의 광 신호 장치를 상상해보십시오. 벨트에 붙인 전구의 색상 으로이 신호를 제어 할 수 있습니다. 좋습니다. 이제 완벽하게 작동하므로 상사는 이러한 신호의 타이밍을 제어하는 ​​방법을 만들고자합니다. 메시지 사이에 간격을 추가하려고합니다. 많은 부분이 이러한 신호의 타이밍과 신호를 동기화하는 것이 얼마나 고통 스러웠는지 공포로 기억합니다. 주말 내내 업무를 수행하지 않으면 서 타이밍을 어떻게 제어 할 수 있습니까? 불에 타 버린 전구를 살펴보고 말 그대로 밝지 않은 아이디어를 얻습니다.

때로는 다형성을 사용하여 아무것도 깨지 않고 무언가를 끄려고 할 때가 있습니다.

디버깅

중단 점을 설정할 때 중단 점이 있어야합니다. 이제 일부 디버거가 닫는 중괄호로 설정하도록 허용하지만 그렇지 않은 경우 언어로 인해 장소가 아무것도하지 않더라도 강제로 배치 할 수있는 것이 좋습니다.

실제로 Java는 아니지만 다음도 있습니다.

이진법

어셈블리 NOP 명령을 사용하면 컴파일 된 이진 실행 파일을 처리 할 수 ​​있습니다. 그러나 현대 Java 컴파일러는 너무 멀리 최적화되어 있습니다. 세미콜론이 단순히 헛소리가 아니라고 확신하지 않습니다. 그러나 예전에는 실행 파일에서이 빈 지점을 사용하여 타이밍을 제어하거나 나중에 후크를 놓을 수있었습니다. NOP가 없으면 실제 지침이 있으므로 후크를 원하면 후크를위한 공간을 만들기 위해 해당 지침을 다른 곳에 복사해야합니다. 이것은 Java가 많은 구문을 얻는 c 언어에서도 잘 작동합니다. 그러나 나는이 훅 피들 링이 Java에서 많이 발생한다고 생각하지 않습니다. 우리는 Aspect Oriented Programming 을 사용 합니다.


2
이것은 pedantic처럼 보일 수 있지만 with 예제 for는 null 문이 아닙니다. Null 문 (일명 빈 문)은 다른 문 (예 :)이 발생할 수있는 동일한 장소에서 발생할 if수 있지만 다음 괄호 for는 세미콜론 사이의 문은 허용하지 않지만 이니셜 라이저와 두 식만 선택적으로 가능합니다. 따라서 세미콜론을 통계 종결 자와 다르게 사용합니다. 빈 문장은 마지막 세미콜론 일 것입니다for(;;);
— JacquesB

당신 말이 맞아요, 이것은 현명한 것 같습니다 : P. 좋아, 내 편집 내용을 참고하십시오.
— candied_orange

-7

Java는 인간 언어와 일치하지 않는 방식으로 설계되었으므로 사용합니다. C의 경우도 마찬가지입니다.

성명은 statement;입니다.

if-then-else 문은 if (condition) statement; else statement;

복합 블록이있는 if-then-else 문은 if (condition) {statements} else {statements}

이것은 분명 말도 안됩니다.

이에 따라 if (condition) {statements} else {statements};논리적이고 합리적이라고 쓴다 .

Java 디자이너가 이것을 if-then-else로 처리하고 null 문을 처리하려면 괜찮습니다. 그것이 행복하다면, 행복하게하세요.


그것은이다 if (condition) {statements;} else {statements;}. 또한 Java는 ;이후에 s를 필요로하지 않는다는 점에서 일관성이 }있습니다. 인간의 언어가 이미 물음표로 끝나는 문장 끝에 마침표를 붙이지 않는 방식과 비슷합니다. (물론, 거기에있는 !?나 ?!결말,하지만 사람들은 단지 근사치 ‽1, interrobang 문자 .)
— 8bittree

1
달콤한 신 !! o_O
— Áxel Costas Pena
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.