2017-12-12 20 views
1

현재 클라이언트/서버 소프트웨어를 개발중인 프로젝트에서 작업하고 있습니다. 나는 이상한 문제가 있었지만 잘하면 해결했다. 그러나 나는 그 원인을 완전히 설명 할 수 없으며 오랜 시간 동안 수색했다.while (true)는 동등하지 않습니다 while (! false)

이전에 서버를 클라이언트가 소켓을 닫은 후에도 서버가 클라이언트를 계속 받아들이도록하려면 서버 측에서 while (true) 루프를 사용하고 싶습니다.

그래서 나는이처럼 만들려고 :

public void run() { 

    Socket socket; 

    while(true) { 
     try { 
      socket = server.accept(); 

      BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); 
      BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 

      while (socket.isConnected()) { 
       // TODO income handling 
      } 

      in.close(); 
      out.close(); 
      socket.close(); 

     } catch (Exception e) { 
      break; 
     } 
    } 
} 

하지만이 루프 종료 조건을 추가 할 말해 IntelliJ에 의해 오류 메시지를 받았습니다. 그러나 나는 잡기 성명서에 하나를 가지고있다.

while(!false) 

while(true) 

변경이 사라질 때까지 오류 메시지가 이어졌다. 아무도 저에게 차이점을 설명 할 수 있고 왜 첫 번째 시도가 효과가 없었습니까? 나는이 방법을 여러 번 연구 중에 발견했습니다.

+4

IntelliJ에는 while (true)를 감지하고 while (! false)를 감지하지 못하기 때문에 분명히 있습니다. 어쨌든 예외가 루프가 끝나는 유일한 방법은 아니어야합니다. –

+2

현재 IntelliJ IDEA (Ultimate 버전, 2017.3)에서 경고 메시지가 표시되지 않으며 코드에 'while'오류가 표시되지 않습니다. '! false'에 대해서는 내가 얻을 수있는 유일한 것이 '간소화 될 수 있다는 것'입니다. –

+0

예, 'break' 문을 제거하면 경고가 표시되지만'break '가 있으면 경고가 표시되지 않습니다. 또한 무한 루프 검사는'! false'가'true'와 동일하다는 것을 이해할만큼 똑똑합니다. 어떤 버전의 IDEA를 사용하고 있습니까? –

답변

0

이것은 아마도 while 루프 조건을 형식화 한 방식 때문일 수 있습니다. 표현식이 복잡하거나 복잡한 경우. 컴파일러는 T.J.와 같은 명령문이 동일하지 않다는 것을 인식하지 못합니다. Crowder는 위에서 언급했습니다. 또 다른 설명은 당신이 만든 while (! false)이 실제로 while (! false)이 아니라는 것입니다. while 루프를 변경 한 항목을 표시하여 다른 사람들의 도움을 얻으십시오.

0

이렇게하면 앱을 패치하고 있습니다.

IDE (IntelliJ)는 사용자가 수행해서는 안되는 작업을 감지하고 IntelliJ는 더 나쁜 것을 추가함으로써 나쁜 습관을 방지하려고 노력합니다.

조건을 잠시 완료하거나 플래그 평가를 사용할 수있는 것으로 변경하십시오.

무한 루프 내에서 무한 클래스와 인스턴스를 선언하는 것은 끔찍한 나쁜 습관입니다.

1

우선 IntellJ IDEA 검사의 목적은 문제가되는 코드를 빨리 발견하고 인생을 어렵게 만드는 것을 돕기위한 것입니다. IDE를 행복하게 만들기 위해 코드를 변경하면 안됩니다.

이 검사 (" 'while 문은 예외를 발생시키지 않고 완료 할 수 없습니다.")는 기본적으로 경고를 생성합니다. 오류이 실제로있는 경우이 검사의 설정을 실수로 변경했을 수 있습니다. 사용 가능한 검사 목록과 심각도 설정은 설정 대화 상자의 편집기> 검사 탭에서 찾을 수 있습니다. while (true)while (!false)의 차이에 관한

: 동일한 바이트 코드를 생성합니다 둘 다 너무 차이,이 의도 구현 단지 부족이 없습니다.

당신은 특히 당신이 할 수있는 의도에 대한 경고를 표시하지 않으려면 : Alt-Enter

  • 방금 ​​오픈에서 선택을 (이 경우 while) 강조 코드에

    1. 장소 텍스트 캐럿을
    2. 눌러 상황에 맞는 메뉴 "검사"무한 루프 문 '옵션'

    그리고

    (210)
    • 것은이 특정 명령문에 대해 사용하지 않도록 설정 (메뉴 항목 "문에 대한 억제")
    • 비활성화 완전히이 검사 (메뉴 항목 "사용 안함 검사")
    • 또는 오픈 설정 대화 상자 (메뉴 항목 "편집 검사 프로필 설정 ").