在完成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值自增1 modifyValueField(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,最后返回副本的值)
在前置++和后置++ 效果相同的时候,最好使用前置++