2014-12-23 522 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)它可以正常工作,但是當我加入名稱驗證頻道(此處再次指出適當的參數)時,什麼都不會發生。一點都不。方法頂部的println語句會運行,但if塊之間的語句不是,所以在我看來似乎有些東西阻止它通過第一個塊,即使它沒有運行。任何幫助將不勝感激。謝謝!

回答

1

如果正在打印「已驗證」但「test01」未打印,則程序必須卡在if(reg.contains(clid)) reg.remove(clid);內的無限循環中。如果reg是你的課程,請調試它;如果它是一個集合類,請確保您沒有不恰當地同時修改它。

+0

感謝您的洞察力。原來,而不是要求從數組中刪除CLID自己,我只是刪除索引(因爲CLID是一個整數),並且由於只有一個CLID在數組中(索引0),沒有索引'1'來刪除。我已經通過將'clid'強制轉換爲對象來解決了這個問題。 –

0

您應該使用調試器逐步完成此操作。我的猜測是,對clientPoke()的調用阻塞等待某些網絡資源。

+0

所有'clientPoke()'都是發送telnet命令的上游,所以我非常懷疑它。感謝調試的想法,但它確實有幫助。 :d –