两个郁闷的异常: 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了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值