1,大家来讨论一下 由于编码不规范 导致的bug,或者效率低下问题,
共同提高自己的 编程经验!
我先举一个我认为不规范,期待你的表演
    
   if ( list == null){
  
       retrun;   }
   for(int i = 0; i < list.size(); i++){
   
      //todo some method   }
每次都要计算list的size大小,效率低下可以改成 这样     
   if ( list == null){
  
       retrun;   }
   int size = list.size();
   for(int i = 0; i < size; i++){
   
      //todo some method   }

解决方案 »

  1.   

    int size = list.size();
       for(int i = 0; i < size; i++){=>
       for(int i = 0,size= list.size(); i < size; i++){
      

  2.   

    不争论这个问题了,请其他高手来 写自己 由于不规范 引起的bug问题吧
    你size没定义
      

  3.   

    if
      do something...
    else if
    else每次都要判断 效率比较低。
    建议使用:swtich()
     case .....
        do something...
     case 
        do something...
      

  4.   

    size没定义
    -----------虽然我很久没写 java 代码,但你不要欺骗我~ C 语系的应该都支持该写法
      

  5.   

    是支持,我更正 我的说法,你这样是对的,
    但是 是不规范 的你要定义 请这样 int i;
    int size;
    不要 int i ,size,这样就是不规范的
    请大家也可以也可以写出 你 不规范的,地方 
    代码是如何不规范,如何难看的 
    比如 有的人 取一个用户注册的页面,就叫 yhzc.jsp
      

  6.   


    我也写个
    传参username,pasword
    错误写法:if(password==null || password.equals("")){
      return "密码空"
    }
    if( username.equals("")|| username==null){
      return "登录名空"
    }正确写法和讲解:
    if( username.equals("")|| username==null){
      return "登录名空"
    }
    这一句顺序写错了,应该先判断是否为NULL。操作符是短路的,可能发生异常,当username为Null时异常
    写成
    if( "".equals(username){
      return "登录名空"
    }另外从业务上来说,第一句也错改为:
    if(password==null || password.trim().equals("")){
      return "密码空"
    }
      

  7.   

    楼主的不错,谢谢,不规范的代码 没有bug也行,请各位不要吝啬啊
      

  8.   

    楼主实在是蛋疼了一个list.size(),jre在运行时会优化的,知道JIT么好比String d = "a" + "d";并不是你写了“+”运行时就一定“+”,编译期早就给你做掉了
    所以问题不能仅仅从代码的角度看,还应该从编译期、运行期看
      

  9.   


    建议常量放前面,“”,null都应放前头,不会产生空指针。
      

  10.   

    顶!是有这么一回事!list.size()并不是每次都计算的,编译时有可能已将做掉了。
      

  11.   


     Query query = em.createNativeQuery("select * from t_user where username= ? and password= ? ")
    .setParameter(1, username).setParameter(2, password);   这样的写法也就是连写啊
       也很容易出问题的啊
      比较好的写法是:
      
       Query query = em.createNativeQuery("select * from t_user where username= ? and password= ? ");
       query.setParameter(1, username);
       query.setParameter(2, password);
      
       这是我最近开发碰到的问题啊
      

  12.   

    楼上都说了 基本上就这些吧还有就是PreparedStatement 和Statement的区别
      

  13.   

    在编写代码时,FingBug检查下。大部分问题都可以解决。
      

  14.   

    其实有这么几类吧:
    1.空指针的处理  String str = null;
      if (str.equals(“xxxx”)) {
         .......
        }
    String str = null;
    if (str!=null && str.equals(“xxxx”)) {
         ......
    }2.内存分配浪费的处理。
      
      ArrayList list = new ArrayList();
      list = Query.getList();//随便一个例子,这个可能不存在
      这个例子,list已经分配了内存地址,然后又将一个新的内存地址赋给它。
      虽然java不用让我们考虑内存分配的问题。但是一个对象构造的时候,开销也是比较大的。3.boolean的判断
      
      boolean flag=false;
      if(flag==true){
         .......
      }4.重复语句的提取
      
      if(xxx==1){
       method();
       ....
       }else if(xxx==2){
      method();
       ....
       }else {
       method();
       .....
       }
       以上的语句换成swtich也一样。method每个分支都调用。
      所以我们可以将它提取出来。
       
      
    5.对象内容的比较
      
       比如两个字符串内容比较
       有人老不习惯性的用==去比较地址。
       一旦创建的过程不同,那么可能就得到不同的比较结果。
      所以最好用equals比较。
      6.数据添加的问题
      有时候我们从数据库取出数据后,遍历数据,将数据添加到一个list中
      结果list显示的时候只有最后一条,说明,我们只对一个对象进行了操作。
      通常我们这样做,就能避免这样的问题
     
      List<XXX> list=new Array<XXX>();
      XXX xxx=null;
      while(rs.next()){
       xxx=new XXX();
       xxx.setName(rs.getString(...));
      list.add(xxx);
      }
     
    问题太多了。不可能都说全面的
      

  15.   

    size那个根本不会影响性能,你可以自己测试一下。我知道的编码规范导致bug 就是 username.equals("") 引发空指针了。
      

  16.   

    勾起不规范的回忆
    其实不规范导致bug的情况我还没见过,各位所说的都不是因为不规范,而是写的时候没有考虑清楚各种情况
      

  17.   

    遍历Map中的元素,使用map.entry再用getKey、getValue获取。比Iterator迭代效率高。
      

  18.   

    楼主 说得对,每次计算缺失耗费了很多性能,我们定义变量的同事定义一个int的东西,这样可以节省很多事件,但是对于这种情况也消耗了系统的对象类型资源,总体来说只要机器允许 用楼主的第二中方法还时非常可取的!!
      

  19.   


      if ( list == null){
           return;
       }
       for(int i = 0; i < list.size(); i++){
          //todo some method
       }我觉的这么写也没有错,你可以试一试,和你优化后的代码没有效率差别,ArrayList的原码可以看出size的实现是
      596       public int size() {
      597           return lastIndex - firstIndex;
      598       }
    只有一个减法运算,没有其他的复杂的东西,而加减法在程序中是最快的运算。
      

  20.   


    LZ,,请用事实说话,
    int i,size;
    这样定义,哪里不规范了?请说明文档出处..===========================还有,程式的改进,一切都是为了"效率"...所有的工作都是为了程式执行的更快.....有时候,不规范的写法有可能比规范的写法执行的更快....所以,请不要过分追求"规范"
      

  21.   

    (内存泄露) 
                   Vector v=new Vector(10);
    for(int i=0;i<100;i++){
    Object o=new Object();
    v.add(o);
                            o=null;
    }
    我们只释放引用的本身。但是v依旧引用该对象。所以这个对象是无法被GC来回收的。
    只有我们手动的将v设为空
      

  22.   

    对于随机访问的数组、ArrayList 的话,建议使用下标进行迭代
    对于链表式的 LinkedList 使用 Iterator 进行访问更快下标访问时,应把判断条件的 size 部分提交:for(int i = 0, k = list.size(); i < k; i++)这样的优化需要遵循一个原则:尽量缩小局部变量的作用范围。
      

  23.   

    当然了,如果下标遍历是个数组的话,那就不需要这样了,直接这样就行了:for(int i = 0; i < arr.length; i++)因为数组的 length 本身就是一个不可改变的量,或者说是一个常量。而 List 的那个 size() 执行的是一个方法,方法的调用多多少少是需要一定时间的。
      

  24.   

    或许大家都用过 BufferedReader 来读取文件中的内容,但是更多的我看到是这样写的:String str = null;
    while( (str = br.readLine()) != null ) {
        ...
    }这样的 str 的作用域在外面的代码块中,不符合尽量缩小局部变量范围的原则。JDK 有个类中的代码是这样写的(具体哪个类我忘记了):for(String str = null; (str = br.readLine()) != null; ) {
        ...
    }
      

  25.   

    哥还是没有分,发一个终极优化代码鄙视一下楼主水平  if ( list == null){
           return;
       }
       for(Iterator it=list.Iterator(); it.hasNext(); ){
            Object ob=it.next();
          //todo some method
       }
      

  26.   

    haha 不是吧,
    下次给你好了,我都是发200的分