2011-09-01 25 views
1

其中一個構造函數具有下面的命令序列:什麼會導致掛在這個「無害」的Java命令序列中?

log.info("A new session of the game started."); 
clientsListener = new ClientsListener(earPort, userName, players, this); 

在日誌文件中我具有由代碼的第一行所產生的語句。所述ClientsListener的構造被寫入通過以下方式:

public ClientsListener(int earPort, String userName, String[] players, Game game) { 
    this.earPort = earPort; 
    this.userName = userName; 
    this.players = players; 
    this.game = game; 
    ServiceBrowser browser; 
    for (String playerName: players) { 
     String serviceType = "_" + playerName + "._tcp."; 
     browser = BrowsersGenerator.getBrowser(serviceType,game); 
     browser.post(userName + ":infoRequest=infoRequest"); 
    } 
} 

BrowsersGenerator.getBrowser具有下面的命令簡單序列:

public static ServiceBrowser getBrowser(String serviceType, Game game) { 
    if (!name2browser.containsKey(serviceType)) { 
     name2browser.put(serviceType, new ServiceBrowser(serviceType, game)); 
    } 
    return name2browser.get(serviceType); 
} 

在上述方法我實例化ServiceBrowser。這個類的構造是:

public ServiceBrowser(String serviceType, Game game) { 
    this.serviceType = serviceType; 
    this.game = game; 
    status = "notActivated"; 
} 

然後,在我請​​的ClientsListener(的代碼的第二塊)的構造。此方法的第一行包含以下內容:

game.log.fine("We entered the post method"); 

並且此語句在日誌文件中不存在。所以,軟件掛在兩次嘗試寫入日誌文件之間。我無法弄清楚代碼中哪些部分是壞的。一切看起來都保存給我。主要問題是我無法重現問題。我發生的情況非常罕見,我只有一個日誌文件需要分析。有誰能幫我解決這個問題嗎?

+1

你在構造函數中做了很多工作,包括建立網絡連接。這通常被認爲是不好的做法。只需在構造函數中構造對象,然後用單獨的方法完成網絡內容。 –

+0

@保羅湯姆林,它會導致問題嗎? – Roman

+0

如果這些方法中的任何一個引發異常,那麼最終會生成一個半結構化的對象。 –

回答

0

如果browser.post()正在做它所說的,的一切都可能發生。但很可能,您的程序在等待不是來自某些防火牆的響應時掛起。

+0

它看起來像'browser.post'沒有做任何事情,因爲這個方法的第一行應該生成一個輸出到日誌文件,而不是。所以,即使方法的第一行也沒有執行。此外,在給定的代碼中,我不使用防火牆(據我所知)。 – Roman

0

您似乎有ServiceBrowser的子類。你確定他們在post方法開始時都有一個日誌命令嗎?您也可以嘗試查看是否在特定類型的ServiceBrowser被調用時掛起。

當你的進程掛起時,你可以在遠程java進程上使用一些工具,如jconsole或jstat來查看當前的堆棧跟蹤,並找出它掛起的位置。