我来到一个熟悉的地方, 却发现许多角落依然陌生...
某日, 我重新建立了测试库, 当着组内所有程序员的面清空了所有业务数据. "好了, 让我看看咱们的系统会发生什么情况, 我敢保证你们负责的部分有80%会瘫掉." 在说这句话时我衷心的祈祷不要被我言中. 但是, 当一个个硕大无比的异常页面张牙舞爪地出现在我面前时, 我意识到我好像总是处于失望中. "你们怎么做的异常处理?? 我强调过多少次了?? 你们懂不懂墨忒尔定理?? 现在看来所有的代码都是基于某种假设, 假设数据是存在并且是正确的, 这是在靠巧合编程!!" 又怒了, 没法控制了. "让你们看看我的程序怎么处理的." 我点开了我负责的页面. 一个完美的页面展现出来, 在他们眼里大概没什么好挑剔的, 我背后却有点冒汗了, 只有我知道, 这个页面和我期望的并不一致, 难道我也是在靠巧合编程?!
代码走查, 一个激动人心的时刻, 看看这段java代码:
for(int i = 0; i < nodeValue.length; i++){
result = new ArrayList();
itr = resourceSet.iterator();
while(itr.hasNext()){
bean = (EsseBean) itr.next()
bean.setNodeValue(nodeValue[i]);
result.add(bean);
}
hash.put(nodeValue[i], result);
}
做个测试:
nodeValue = {"aaa", "bbb"};
bean = (EsseBean) ((ArrayList) hash.get("aaa")).get(0);
print("The key is aaa; The value is " + bean.getNodeValue());
猜猜打印出的会是什么?
没错, 是 "The key is aaa; The value is aaa".
真的是这样? 你对此确信无疑?
真实的结果是: "The key is aaa; The value is bbb".
我太过于信赖 "java没有指针" 这句话. 不对, 应该说对语言的特性理解的还不够, -_-||| . 好在我前几天刚刚把 "Thinking in java 3th" 读了一遍, 马上想到了Clone. 修改后的循环如下:
while(itr.hasNext()) {
bean = (EsseBean) ((EsseBean) itr.next()).clone; /*depth clone in EsseBean*/
bean.setNodeValue(nodeValue[i]);
result.add(bean);
}
够味!
看来做事要低调啊.
接替我工作的同事将菜单文件全部改了一遍, 其实就是改了个她不清楚的属性, 要命的地方就在这, 更改导致一大片子菜单丢失了. ^_^ 有多年工作经验的老手尚且会出这种问题, 值得警惕. 我的结论是: 不要轻易改动你不知道或一知半解的事物. 我多次看到同一模块, 同一作者的页面字符集分别用到了"GBK" 和 "GB2312". 除了编码时粗心大意外, 最可能的原因就是编写页面的程序员不清楚二者间的差别. baidu一下只需30秒就能知道它们的主要差别: GBK是GB2312的超集, GB2312没有收录繁体中文. 对于经常在眼前晃悠而自己又不明白的东西最好弄懂它, 否则日后传出去多丢脸.