2014-12-23 3 views
0

여기에 작은 코드 조각이 있습니다. 누군가가 TeamSpeak에서 채널을 전환하면이 코드가 호출됩니다. clid은 사용자의 ID이고 cid은 채널 ID입니다. 정수 lobbyverified은 '토너먼트 로비'및 '이름 확인'채널을 나타내는 사전 설정된 ID이고 reg은 누가 로비에 있는지를 결정하기위한 ID의 Vector입니다. 이 함수 외부의 reg에 대한 유일한 참조는 선언과 초기화입니다. 여기 코드는 다음과 같습니다Java 코드 실행 중지?

public void handleClientMove(int clid, int cid) 
{ 
    String name = query.getClientNameFromID(clid); 

    System.out.println(cid == lobby ? "lobby" : cid == verified ? "verified" : "non-tournament"); 

    if(cid == lobby) 
    { 
     System.out.println("Handling Tournament Lobby"); 

     if(!reg.contains(clid)) 
     { 
      query.clientPoke(clid, "Welcome to the Tourney! Please change your name to include your rank. ex: 'D5 Name', 'M1 Name2'"); 

      reg.add(clid); 
     } 
    } 
    else 
    { 
     if(reg.contains(clid)) reg.remove(clid); 
    } 

    System.out.println("test01"); 

    if(cid == verified) 
    { 
     System.out.println("Handling Name Verified"); 

     if(!isUserRegistered(clid)) 
     { 
      participants.add(new Player(name, clid, true)); 

      query.clientPoke(clid, "Your name has been verified and you are now entered in the tournament!"); 
     } 
    } 
} 

println 문은 디버그 목적으로 만 있습니다. 내가 채널을 로비로 전환하면 (올바른 디버그 문으로 인해 clidcid이 전달되었음을 확인할 수 있음) 제대로 작동하지만 Name Verified 채널에 다시 가입하면 아무런 문제가 발생하지 않습니다. 전혀. 메소드 상단의 println 문이 실행되지만, if 블록 사이의 블록은 실행되지 않습니다. 따라서 실행되지 않아도 첫 번째 블록을 지나치지 못하게하는 것처럼 보입니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!

답변

1

"확인 됨"이 인쇄되었지만 "test01"이 인쇄되지 않으면 프로그램이 if(reg.contains(clid)) reg.remove(clid); 안에있는 무한 루프에 걸려 있어야합니다. reg가 클래스이면 디버그하십시오. 콜렉션 클래스의 경우, 부적절하게 동시에 변경하지 않는지 확인하십시오.

+0

통찰력에 감사드립니다. 배열에서 CLID 자체를 제거하라는 요구가 아니라 CLID가 정수이기 때문에 색인을 삭제할 뿐이며 배열 (인덱스 0)에 하나의 CLID 만 있으므로 제거 할 색인이 '1'이 아닙니다. . 나는 clid를 객체에 던져서 문제를 해결했다. –

0

디버거를 사용하여 단계별로 수행해야합니다. 내 생각 엔 clientPoke()에 대한 호출이 일부 네트워크 리소스에서 대기하는 것을 차단하고 있다는 것입니다.

+0

모든'clientPoke()'는 telnet 명령을 업스트림으로 보내므로 의심 스럽습니다. 디버깅에 대한 아이디어에 감사 드리며, 실제로 도움이되었습니다. :디 –