问题:我采用服务器在每获取一个客户端的socket时就开启一个新的线程来处理这个请求,我把PrintWriter pw = new PrintWriter(System.out,true)这句放入到try中自动关闭
资源块中。第一个客户端来访问正常,但后面访问就在控制台上再也看不到打印的数据。。郁闷
解决办法: 我把PrintWriter pw = new PrintWriter(System.out,true)从自动关闭资源块中移除来。
原因: 由于你把最底层的输出流给关闭了,下次Sytem.out这个输出流为null但它不会抛异常它会假装很正常的往下执行完
源码分析:
//所有的println都会最终调用这个方法从这里可知道它很恶心的偷偷将它正常化
public void write(String s, int off, int len) {
try {
synchronized (lock) {
ensureOpen();
out.write(s, off, len);
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}