2012-07-15 4 views
1

현재 텍스트 북을 사용하여 프로젝트를 진행하고 있으며 while 루프에 대한 모호한 문제가 있습니다. 교과서의 코드는 다음과 같습니다.Java - 대체 While 루프 선언

while(getImage().getWidth(applet) <= 0); 
double x = applet.getSize().width/2 - width()/2; 
double y = applet.getSize().height/2 - height()/2; 
at = AffineTransform.getTranslateInstance(x, y); 

결국 세미콜론으로 선언 된 while 루프는 본 적이 없으므로 코드를 표준으로 해석했습니다.

while(getImage().getWidth(applet) <= 0) { 
    double x = applet.getSize().width/2 - width()/2; 
    double y = applet.getSize().height/2 - height()/2; 
    at = AffineTransform.getTranslateInstance(x, y); 
} 

누군가 둘 사이의 차이점을 설명해주세요. 내 코드가 첫 번째처럼 바뀌었고 프로그램이 잘 작동했지만 차이점을 이해하지 못했습니다.

답변

2

http://users.csc.calpoly.edu/~jdalbey/SWE/JavaPitfalls.html. while(getImage().getWidth(applet) <= 0);의 아이디어는 애플릿의 너비 크기가> 0이 될 때까지 대기하는 것입니다. 그 후 나머지 코드가 진행되었습니다. (애플릿을 초기화하는 다른 프로세스를 기다릴 수도 있습니다).

4

세미콜론은 빈 문장입니다. while 루프의 연속 조건을 평가할 때 부작용이있을 때 사용할 수 있습니다. 루프는 완료시 루프 조건을 무효로하거나 부작용을 일으킬 수있는 부작용 체인을 생성합니다.

예를 들어 getImage()을 호출 할 때마다 새 이미지가 표시되면 반환 된 이미지의 너비가 <= 0이 될 때까지 루프가 계속됩니다. 여기

문자열에 a 후 첫 문자 찾는 while 루프를 사용하는 간단한 예이다 :이 혼동 될 수있다 같은 코드를 판독하기 때문에

int pos = 0; 
String s = "quick brown fox jumps over the lazy dog"; 
while (i != s.length() && s.charAt(i++) != 'a') 
    ; 

를에 세미콜론하는 전형적인 루프 문으로 들여 쓰여진 별도의 줄.

0

세미콜론은 첫 번째 예제에서 while 루프의 끝입니다. 이처럼 한 줄짜리 루프를 사용하는 것이 때로는 유용하지만 일반적인 실수이기도합니다.

의도적 인 경우이 코드가 다른 스레드가 해당 애플릿의 너비를 변경하기를 기다리는 것 같습니다. 이런 식으로 할 수있는 좋은 방법은 아닙니다.

0

무한 루프입니다. 오타가 아닌지 잘 모르겠다면 같은 방법으로 글을 쓸 수 있습니다.

나는 이것이 오류를 잡아 내고 그렇게 축하해 주는지보기위한 시험이라고 생각합니다!

참조 : 변화가 코드의 논리를 변경

+0

Mike F.명시된 바와 같이, 어떤 사건이 발생할 때까지 막을 수 있지만, 교과서에 있다면, 당신을 그루터기로 디자인 할 수 있고, 당신이 그것을 잡았는지와 올바른지 확인하십시오. 나중에 기사가 있습니다 : http://users.csc.calpoly.edu/~jdalbey/SWE/JavaPitfalls.html –

1

의도적입니다. 이미지는 백그라운드 프로세스에서 비동기 적으로으로로드되고 getWidth(ImageObserver)은 이미 이미지가 너비를 줄 수 있는지 여부를 묻습니다. 이것은 단순히 소위 통화 중 루프입니다. 최초의 getWidth는 -1입니다.

이것은 코딩 스타일이 좋지 않으며 getHeigth가 아직 완전히 읽히지 않은 곳에서 getWidth를 알 수 있습니다.

이것은 인터넷 연결 속도가 느린 자바의 첫 번째 기간에서 유래했습니다.

ImageObserver 콜백을 사용하는 것이 더 좋습니다.