java中 a++ 和 ++a

来源:互联网 发布:手机号码定位软件免费 编辑:程序博客网 时间:2024/05/06 03:20

背景:

     在完成DRP项目的一个添加功能时,主键通过id生成器自动控制。当所有的代码完成后,执行添加时,报错了“java.sql.SQLException: ORA-00001: 违反唯一约束条件(DRP1.PK_T_CLIENT)”,意思是要插入的主键值已存在。

代码:

 查看控制主键的代码

value = rs.getInt("value");  //从记录主键值的表中获取当前的value值modifyValueField(conn,tableName,value++);  //将加1后的value值更新到表中

分析:

从代码中可能大家都看出来了,关键就在value++这个参数。

java中的运算符有前置++ 和后置++,二者是有区别的。

Int a =1;

i=a++;  表示先将a的值赋值给i,然后a自身再加1.    计算结果为:i=1,a=2

i=++a; 表示a先自加1,然后再赋值给i。                   计算结果为:i=2,a=2

所以,实际上传入的参数value++的值还是原来的值,这就必然导致插入重复的主键值。将参数改成++value 或者在传参之前先进行一次value++,然后直接传value参数都是对++的正确应用。代码表示:

value = rs.getInt("value");  //从记录主键值的表中获取当前的value值 modifyValueField(conn,tableName,++value);  //将++value作为参数传递或者value = rs.getInt("value");  //从记录主键值的表中获取当前的value值value++;  //vaue值自增1modifyValueField(conn,tableName,value);  //将新的value值更新到表中

 

其实,这是一个基础问题,但是今天还是在这里摔了一跤,主要还是因为没有仔细区分过这个知识点。之前,在写代码的时候总是会出现a++(常见的for循环中),写习惯了导致这里上来也就写a++。现在,再回头看一下那段代码,其实,如果当时好好分析一下,估计今天这个错误也能避免了。

int a[] ={1,2,3,4,5};

for(int i=0; i<a.length; i++){

         System.out.println(a[i]);

}

 

 补充:(参考:http://blog.sina.com.cn/s/blog_6b51e9370100ya29.html)

a++和++a本质上的区别:

前置++不会产生临时对象  

后置++在返回时有一个临时对象的创建(a++ 相当与a先创建自身的一个副本,然后a自增1,最后返回副本的值)

在前置++和后置++ 效果相同的时候,最好使用前置++

原创粉丝点击