1、 请指出下列代码段中的错误或不足之处(下面的代码段都可以成功编译),并说明原因。
 (1) 组
String s1 = "abc";
String s2 = "fde";
String s3 = "gbc";
String s = s1+s2+s3; (2)组
if (formBean.getStatusId().equals("930")) {
}(3)组
public void f(){
    DBean db = null;
    Connection con = null;
    try {
      db = new DBean();
      db.connect();
      con = db.getConnection();
      .....
      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
}
public void g(){
    f();
}(4)组
UserTransaction transaction = null;
  try {
    PolicyDAO.create(...);//insert a record     
    transaction = Trans.getUserTransaction();     
    transaction.begin();
      ....
    PolicyDAO.update();//update the record 
    transaction.commit();
  }catch (Exception e) { 
    transaction.rollback(); 
    throw e; 
  }

解决方案 »

  1.   

    (2)组
    if (formBean.getStatusId().equals("930")) {
    }应该写成if (formBean.getStatusId()!=null&&formBean.getStatusId().equals("930")) {
    }要不可能抛空指针(3)组
    db = new DBean();
    最好改成单例模式 ,
    (4)组PolicyDAO.create(...);//insert a record   也应该加到事物控制里吧以上仅供参考,我是刚学习java的
      

  2.   

    1。直接写字符串,效率高
    2。判断null
    3。finally里close
    4。事务第一个要调begin
      

  3.   

    String s1 = "abc";
    String s2 = "fde";
    String s3 = "gbc";
    String s = s1+s2+s3;
    String类型生成后是不会改变的 所以s1+s2="abcfde"也会被保存到内存中建议用StringBuffer 他是可变的
      

  4.   

    组1:
    String s1 = "abc";
    String s2 = "fde";
    String s3 = "gbc";
    StringBuffer s = new StringBuffer();
    s = s.append(s1).append(s2).append(s3);
    组2:
    if (null != formBean && null != formBean.getStatusId() && ("930").equals(formBean.getStatusId())) {
    }
    组3:
    增加数据库连接池的模块,将数据库连接封装。
    组4:
    在try-catch模块语句增加finally语句,用来关闭连接等操作!
      

  5.   

    (4)组
    UserTransaction transaction = null;
      try {
     
      transaction = Trans.getUserTransaction();   
      transaction.begin();
      ....
     PolicyDAO.create(...);//insert a record   //把这个也加到事物控制中
      PolicyDAO.update();//update the record  
      transaction.commit();
      }catch (Exception e) {  
      transaction.rollback();  
      throw e;  
      }
      

  6.   

    第一个用StringBuffer第二个加入非空判断第三个把con.close();放到finally {} 里, 应为不管程序出不出现异常我们都要吧connection 关掉第四个把PolicyDAO.create(...);//insert a record   放到transaction.begin();之后, 然后, 在catch 中加transaction 的非空判断,如果为空就没有必要回滚了
    }catch (Exception e) { 
      if(null ! = transaction) {
         transaction.rollback(); 
      } 
      throw e;  
      }
      

  7.   

    第一组,建议用StringBuffer,因为String是final的,所以会生成很多没用的对象
    第二组,写成if("930".equals(formBean.getStatusId()) {}//否则当formBean.getStatusId()得到null时,会报空指针异常第三组,把conn.close()放到finally中,因为这样,不管发生什么情况,都会关闭。上面的程序当发生异常后,conn就不会关闭。
    第四组,应该把回滚的代码放到catch中,这样就会保证数据的完整性!
      

  8.   

    回滚的代码放到catch中??怎么做
      

  9.   

    不知道你说的是哪个版本的JDK,如果是1.5+,就不会出现你说的状况,JDK会自动用StringBuilder来组装的
      

  10.   

    你是说 s1+s2+s3 会被这样执行? new StringBuffer().append(s1).append(s2).append(s3).toString();而不是 s1+s2 计算后生成 String对象 然后再计算 +s3?我是新学习java的,对此理解不深 
      

  11.   

    这是我面试的一些个题目
    上面说的各有道理吧。只是觉得都不太完整。
    String 是以对象形式存在的,多个String对象被new出来之后存在于内存当中,其实String的效率是高于StringBuffer的,但是由于内存的占有给gc带来负担,从全局来讲是不推荐使用String来实现可变字符串的,因为这样的系统可能久了之后容易出现系统缓慢或者其他问题。而equals方法,一般推荐将确定的字符串放在前面,这样可以避免NULL指针异常。后面两道我和各位理解的也差不多,谢谢各位了。