1. 聚能聊>
  2. 话题详情

失之毫厘差之千里,你把“对象”放错位置了吗?

七夕,一波波狗粮,一波波情话,过了;

周末,一波波敌人,一波波海浪,也过了。

是时候放下你心里的那个对象好好工作了。

工作开始了,你是把你的对象放一旁了,但是你确定你把你的“对象”放对位置了吗?

这次我们聊聊把“对象”放错位置的后果。

前几天有一位同事需要做与我一样的功能,而这个功能是我已经开发好了的,他只需直接把我的代码拿去修改就可以。结果,我的代码可以正常运行,他的代码在开启服务之后,控制台就不断有日志输出,开发环境进入了死机状态。

在我们不懈地努力之下,最终发现了问题:他把一个对象的创建放在了循环体外。

以下是代码重现

       //在循环外部创建对象
        List<Item> itemListOut_t1 = new ArrayList<>();
        //创建中间对象 item_t1
        Item item_t1 = new Item();
        for (Item itemIn : itemListIn) {
            item_t1.setItemId(itemIn.getItemId());
            item_t1.setItemName(itemIn.getItemName());
            itemListOut_t1.add(item_t1);
        }

        //在循环内部创建对象
        List<Item> itemListOut_t2 = new ArrayList<>();
        for (Item itemIn : itemListIn) {
            //创建中间对象 item_t2
            Item item_t2 = new Item();
            item_t2.setItemId(itemIn.getItemId());
            item_t2.setItemName(itemIn.getItemName());
            itemListOut_t2.add(item_t2);
        }

运行结果如下:
_

通过控制台可以很容易地看出来,在循环外部创建对象是错误的,在循环内部创建对象是正确的。

产生出两种不同输出效果的原因如下:

在循环外部创建对象,使得循环内部一直使用同一个对象,虽然 itemListIn 循环了三次,item 也被三次添加到 itemListOut_t1,但是三次都是同一个对象,换句话说,最后 itemListOut_t1 得到的三个对象是相同的。

而在循环内部创建对象,循环内部使用的是三个不同的对象,最后 itemListOut_t1 得到三个不同的对象。

以下是相关文章链接:

当你无法发现问题所在时,不要简单地把代码或者数据还原

探讨:在循环前与在循环中创建对象的区别

以下是本次话题讨论:

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    淘公仔 x 2

  • 奖品二

    阿里云代金券 x 2

  • 奖品三

    定制笔记本 x 2

8个回答

0

微wx笑 已获得定制笔记本 复制链接去分享

这个话题是怎么了,问题太深了?

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
类似作用域的问题,做为程序员应该很清楚这个问题的严重性。
单步调试,跑一遍代码基本能发现问题吧。

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
想起几年前的一件事,两个子公司合并到一起办公,另一个公司的美女前端遇到网页上JS代码块不生效的问题,那边的老总把我抓过去解决问题;打开开发者工具一看,也没有任何错误,再一看代码,JS都写在Head标签里了;于是换了一下位置,结果你们应该知道了。

浮生递归 回复

我以前JS也放HEAD里啊,没影响运行啊

微wx笑 回复

$(document).ready();这种不会。页面没加载完通过ID之类的是找不到的。

浮生递归 回复
回复@微wx笑:

哦,是的,一般我都直接写入到一个JS文件里,引用过来,这样HTML代码会更简洁点。

微wx笑 回复

嗯,但又多了并发请求;通过OSS做动静分离能否把这人并发分离出去?

评论
1

黄二刀 已获得淘公仔 复制链接去分享

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
我曾经也遇到过这种问题,当初开始学编程,经常遇到各种各样因编写失误而导致的内存错误问题,后来慢慢。随着经验的积累,很少再去犯类似的错误了。
2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
有,把对象对象或属性设成静态的,结果尴尬了,得到的不是自己预期的输出结果。我是通过设置断点来找出问题的,一试一个准。

黄二刀 回复

咖啡,要不要赏赐笔记本。

评论
0

wangccsy 已获得阿里云代金券 复制链接去分享

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
基本上自己写的代码现在已经很少有这种情况了。但通常由于选择顺序造成可能没有初始化就调用赋值发生空指针的情况是有的。现在的IDE功能都是十分的强大了,只要设置断点很容易发现问题的所有。还有就是做好单元测试,也很容易发现这种常识性错误了。

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
曾经写了一个代码。刚开始好好的,运行正常。后面优化了一下代码,不能运行了。发生了空指针异常。通过IDE的调试功能发现优化后的代码还没有初始化就开始使用了。感话强大的IDE。

0

宇宙宙长 已获得阿里云代金券 复制链接去分享

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
很频繁的问题,遇到类似的问题可能一下子找不出来,盯着出错先发会呆,再静下心慢慢找,再调试。

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
定义变量的时候有时不注意全局还是局部产量而放错位置,按照报错的提示,一点一点的调试,总能找出来的。

0

浮生递归 已获得定制笔记本 复制链接去分享

首先,我随便一瞄,就发现你命名不规范,哈哈。开心。

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
又遇到过,而且还比较经常吧。感觉都是不在状态,或者太粗心等等引起的。找问题,当然就是代码一行行去查看咯,当然,有时候会直接跳出是第几行,这种是最酸爽的,直接处理掉就行了。就怕定位不到问题点,只要定位准确了,还是很好处理的。

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
有,不仅仅是把对象放错位置,有时候还会犯点基本语法的错误,把代码片段甚至单词放错位置了。或者某些代码的书写格式太久没写,生疏了,也容易搞错前后顺序,然后出现问题。当然,这些都是在本地调试的时候,就直接会报错,所以根据提示,调整下就好了。基本没什么大问题。

0

aoteman675 已获得淘公仔 复制链接去分享

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的?
设置断点,单步调试,在控制台输出信息,就能找到问题了。前几天就是有一个循环,把数据跑完了,居然忘记赋值,记过控制台输出null。
2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?
上星期写个ServletContextListener监听UDP的时候,在contextInitialized里面另外开一个线程Thread,结果就死在里面了。然后把线程Thread换个位置,把在listener-class的监听类直接继承Thread,然后在contextInitialized里面super.start();结果就好了。