最近在做测试是遇到下面一段代码:
当时想都没想,直接提bug了。
结果跟测试式样书作成者一确认,在这段代码的类里面添加了main函数跑了一下,惊奇的发现,m_strRound设置为“up”或“down”的时候,程序竟然能够跑到分支里去。
写java程序也有两三年了,脑子里面有个根深蒂固的条律就是:比较String一定得用equals方法。但这里竟然使用==比较,并且成功了!?
非常不解,因此到google了一下,发现已经有很多人讨论并解释了这个问题,如下:
[url]http://www.51ria.com/blog/?p=37l[/url]
恍然大悟!
但问题并没就此结束,虽然在我写的main方法里测试时,==有效。但当我在画面上(我们的工程是一个struts工程)输入m_strRound为“up”时,却没有跑出来期待的结果,通过打log发现,此时==就不管用了。
因此推断,struts将换面上的“ up”设置到form中时,可能是通过new String("up")生成的,反正跟后台代码中的“up”字符串的内存地址不同,所以==就不好使了。程序还是有bug,并且就是==号引起的。
看来,条律是对的,即使==在某些情况下是有效地,也不要使用它。因为它很有可能会带来bug,并且影响可读性。
最终判定,上面那段代码很烂!!
if((m_strRound == "up") && (fExecute)){ //切り上げ
bdValue = bdValue.setScale(nLength, BigDecimal.ROUND_UP);
}else if ((m_strRound == "down") && (fExecute)){ //切り捨て
bdValue = bdValue.setScale(nLength, BigDecimal.ROUND_DOWN);
}
当时想都没想,直接提bug了。
结果跟测试式样书作成者一确认,在这段代码的类里面添加了main函数跑了一下,惊奇的发现,m_strRound设置为“up”或“down”的时候,程序竟然能够跑到分支里去。
写java程序也有两三年了,脑子里面有个根深蒂固的条律就是:比较String一定得用equals方法。但这里竟然使用==比较,并且成功了!?
非常不解,因此到google了一下,发现已经有很多人讨论并解释了这个问题,如下:
[url]http://www.51ria.com/blog/?p=37l[/url]
恍然大悟!
但问题并没就此结束,虽然在我写的main方法里测试时,==有效。但当我在画面上(我们的工程是一个struts工程)输入m_strRound为“up”时,却没有跑出来期待的结果,通过打log发现,此时==就不管用了。
因此推断,struts将换面上的“ up”设置到form中时,可能是通过new String("up")生成的,反正跟后台代码中的“up”字符串的内存地址不同,所以==就不好使了。程序还是有bug,并且就是==号引起的。
看来,条律是对的,即使==在某些情况下是有效地,也不要使用它。因为它很有可能会带来bug,并且影响可读性。
最终判定,上面那段代码很烂!!

527

被折叠的 条评论
为什么被折叠?



