铭记逻辑错误
大概是花了4个小时吧,也许是更多时间,就是因为一个小小的逻辑错误,一个比较容易忽略的逻辑错误!!!
好了,看题目吧,做了一个基于Tcp协议的聊天软件(Java),最近想把图片封装发送,实现双方交互,显示图片,把图片转换成byte[]二进制处理,由于在发送时可能是多个图片所以用了一个Vector<buff[]> imageVector=new Vector<buff[]>()的,这里因为用到多线程的处理双方信息交互,同时又要求同步安全,Vector正好满足要求,于是乎,放开手一路coding下去,然后run,编译链接通过,可是添加发送图片时,只在发送者的聊天框里显示图片,无奈就是不再对方的聊天框中显示,什么原因呢??
message.setObj(imageVector)没有执行吗???不可能,因为发送方的图片是messge.getObj(imageVector)得到的,可是什么地方没有执行呢??然后是Debug进行调试,显示transImageVecotr=messge.getObj(imageVector)得到的size是0,这下彻底晕了。封装后全部是空了??? 这也太不可思议了。。。。然后找到Message封装类中Vector的封装
public void setImageVector(Vector<byte[]> imageVector){
System.out.println("在ChatMessage中封装的过程情况测试:是空吗??"+imageVector.size());
for(int i=0;i<imageVector.size();i++){
System.out.println("先遍历一下Vector看是否存在元素,各元素值??"+imageVector.get(i));
}
this.imageVector=imageVector;
System.out.println("Vector赋值成功了吗?看其大小!!"+this.imageVector.size());
}
public Vector<byte[]> getImageVector(){
System.out.println("Vrctor可以获得图片吗?"+imageVector.size());
return imageVector;
}
决定看看控制台里到底输出什么?在发送者里的信息中发现imageVector都有值,可是在接收端的imageVector里发现仍是空,趴下了!!!!两个用的是一个同一个message为什么一个非空,一个是空呢???? 难道是Tcp协议的问题,多线程非安全性问题,不对啊,Java API 说了,Vector俺提供线程安全,协议只会发送不会需改信息啊!还是自己的错吧,最后
一直让我蛋疼了几个小时的错误写法:
System.out.println("Message打包前图片个数:"+chatMess.getImageVector().size());
ChatView.this.addMessage(chatMess, true); //执行过这里后chatMess将清空
QQMessage message = new QQMessage();
message.setObj(chatMess);
message.setType(30);
System.out.println("Message打包后图片个数:"+chatMess.getImageVector().size());
System.out.println("WriteMessage前图片个数:"+((ChatMessage)message.getObj()).getImageVector().size());
WriteMessage(message);
System.out.println("WriteMessage后图片个数:"+((ChatMessage)message.getObj()).getImageVector().size());
改正后的结果:
System.out.println("Message打包前图片个数:"+chatMess.getImageVector().size());
QQMessage message = new QQMessage();
message.setObj(chatMess);
message.setType(30);
System.out.println("Message打包后图片个数:"+chatMess.getImageVector().size());
System.out.println("WriteMessage前图片个数:"+((ChatMessage)message.getObj()).getImageVector().size());
WriteMessage(message);
ChatView.this.addMessage(chatMess, true); //执行过这里后chatMess将清空
System.out.println("WriteMessage后图片个数:"+((ChatMessage)message.getObj()).getImageVector().size());
到这里错误显而易见了,就是自己书写的错误,这里程序单个类大概达到了一千多行了,或许是程序太长了造成的自己逻辑混乱,更多的原因是自己代码能力的不过关!!!
这里只是一个经验,时间和精力换来的,害得我晚上睡都没睡好!!! 2011/11/20