兩個鬱悶的異常: java.lang.StackOverflowError和java.net.SocketException: Broken pipe

debug了幾乎一天,就爲了一個bug,折騰死我了。

bug的緣由是因爲寫代碼的時候不小心,將:


寫成了:

很明顯,一個函數開始無限制地遞歸地調用自己了。
過不了多久,這個函數所在的thread的stack就會滿了,所以會拋出 StackOverflowError。
一旦發現了java.lang.StackOverflowError,就說明程序中存在着死循環,或者遞歸層次過多,將當前thread所分配的stack全部用完了...


在我的程序中,這個java.lang.StackOverflowError是個意料之外的異常,我沒有捕捉它,相反,這個exception被mina拿到了。在mina框架中,一旦它抓住了一個異常,就會調用exceptionCaught方法,這個方法默認會將Session關閉,於是反映出的現象是:
client端如果從connection pool中提取之前用過的socket進行通信,就會報告java.net.SocketException: Broken pipe。
原因就是Server端的socket被server主動關閉了。
這個現象非常類似於linux C網絡編程中出現的SIGPIPE信號。雖然我沒有查到準確的資料,但是我大概可以確定java中的Broken pipe異常就是因爲檢測到了SIGPIPE。
而產生SIGPIPE的一個典型場景就是在client-server架構中,server端主動關閉了socket連接。這時候client端的socket就會接收到一個RST包。如果我們繼續對一個已經接收了RST包的socket調用寫操作,就會產生SIGPIPE了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章