两个郁闷的异常: java.lang.StackOverflowError和java.net.SocketException: Broken pipe

debug了几乎一天,就为了一个bug,折腾死我了。

bug的缘由是因为写代码的时候不小心,将:

public boolean isEmpty() { return this.queue.isEmpty(); }
写成了:
public boolean isEmpty() { return this.isEmpty(); }
很明显,一个函数开始无限制地递归地调用自己了。
过不了多久,这个函数所在的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了。

你可能感兴趣的:(thread,exception,socket,server,session,Mina)