第一个问题:
if (dto == null || dto.size() == 0) {
return -1;
}上面代码的dto 如果是null的话 会不会报错。也就是说 第一个条件是true 还走不走后面的那个判断 如果走 就是空指针异常了。第二个问题:
C17Dto dto = new C17Dto();
dto = dao.select(“ddd”);

C17Dto dto=dao.select(“ddd”);
有什么区别。
(另,如果dao.select(“ddd”); 查不到数据,那个dto 是NULL 还是0条?)以上,谢谢

解决方案 »

  1.   

    第一个问题.不会报错.||是或的意思.只要二个条件满足一个的话就可以了.
    new 了一个对象.不会容易产生空指针.查不到数据的话是null
      

  2.   

    第一个问题:
    如果dto是null,则不会执行后面那句,所以不会报异常。第二个问题:
    C17Dto dto = new C17Dto(); 
    dto = dao.select(“ddd”); 
    是首先new一个C17Dto对象,然后dto指向这个对象,第二行则表示dto重新指向dao.select("ddd")返回的C17Dto对象(也可以是其子类对象)
    而C17Dto dto=dao.select(“ddd”);则是直接指向dao.select("ddd")返回的对象,从程序执行结果的角度来看,是没有什么区别的。另:
    如果dao.select(“ddd”); 查不到数据,那么要看select()这个方法的返回值,如果是null,那么dto就是指向null了。
      

  3.   


    不会 !因为 || 是短路运算,第一个条件满足就会不会去运算后面的条件。&& 同理,第一个条件不满足也不会去运算后面的条件。
    2
    有区别的。C17Dto dto = new C17Dto(); 新创建了一个对象。
    dto = dao.select(“ddd”); 将dto对象的引用指向 dao.select(“ddd”)返回回来的对象。而C17Dto dto=dao.select(“ddd”); 没有创建对象。直接创建一个引用指向dao.select(“ddd”)返回回来的对象。
      

  4.   

    if (dto == null || dto.size() == 0) 
    如果dto == null,后面的就不走了。第二个问题:
    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);

    C17Dto dto=dao.select(“ddd”);
    有什么区别。 没有区别。dto取决于dao.select中的写法。若返回null ,就是null。返回空集,就是空集。
      

  5.   

    第一个问题:
    if (dto == null || dto.size() == 0) {
    return -1;
    }不会报错,这是一短路判断,只要有一个条件符合就不会往后判断了第二个问题:
    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);

    C17Dto dto=dao.select(“ddd”);
    有什么区别。
    (另,如果dao.select(“ddd”); 查不到数据,那个dto 是NULL 还是0条?)
    如果是第一种,并且dao.select(“ddd”); 查不到数据,那么dto!=null
    而第二种dao.select(“ddd”); 查不到数据,那么dto==null
      

  6.   


    麻烦你们亲自试一试。
    我不明白,如果代码这样写:
    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);
    那么照你的意思,即使dao.select(“ddd”)的代码中明确返回了null,dto也不是null是吗?
      

  7.   

    C17Dto dto = new C17Dto(); 
    dto = dao.select(“ddd”);
    首先创建一个新实例对象,在堆栈中分配一个内存空间(new),然后 dao.select(“ddd”)返回一个特定的对象并将该返回的对象复制到dto中。而返回的对象无法引用,应为没有该对象的引用(在c++中就叫指针了)C17Dto dto=dao.select(“ddd”); 
    返回一个对象,并创建该对象的引用,此时的对象可以引用了。我是这样理解的不过第二种编译会同过吗?我还没这么用过呢
      

  8.   


    嘿嘿!动手试试,再来说话。
    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);
    你们是不是都以为这样写就防止抛空了?god,多一行代码而已。
      

  9.   

    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);
    这样的话 dao.select(“ddd”)查不到数据 dto也不是null吗?
      

  10.   

    dto是不是null要看你的select方法啊,你又不把select方法贴出来,叫别人怎么帮你判断?
      

  11.   

    对于第二个问题,C17Dto dto = new C17Dto(); 之后如果没有其他语句,
    像try{
    dto = dao.select(“ddd”); 
    }或者if(。){dto = dao.select(“ddd”); }
    之类的,完全可以C17Dto dto =  dao.select(“ddd”); 
    第一种完全浪费了一次资源!
      

  12.   

    是不是应该写成 null==dto ???
      

  13.   

    有什么问题么?我的意思是这里没有多创建一个对象。至于在select()方法里面怎么实现的--是创建一个对象返回,还是用单例模式返回,不是我说的有区别的范畴!
    请bayougeng 指教!
      

  14.   

    看问题可以有多面。我是从创建对象的方面去考虑,就程序结果来说,确实没有区别。
    但明显
    C17Dto dto=dao.select(“ddd”); 
    写法好----可能这不是楼主问题的本意,少创建一个对象!
      

  15.   

    我想了解的是不是如果用了new 只单单是浪费资源这么简单
      

  16.   

    JAVA中如果有对象已经没有任何引用来引用它,就会被当作垃圾被垃圾回收器处理。
      

  17.   

    肯定是可以编译的。而且这里也不会报任何空异常。
    就算返回的是null.也只是把原来指向new C17Dto();的引用指向了null,而已。当你再调用dto对象的方法的时候,还是会报空异常的。
      

  18.   


    那这个 try 或if  又怎么利用这个资源了呢?
      

  19.   

    这里用
    C17Dto dto = new C17Dto(); 我认为没有任何意义。
    我们分情况来讨论,当你程序执行
    dto = dao.select(“ddd”); 时,如果dao.select(“ddd”); 返回一个C17Dto 对象,引用dto立马指向 这个返回的C17Dto对象,但是你原来new 出来的C17Dto对象并不会马上被回收(这里不是说垃圾回收线程有限很低的问题),主要是不满足垃圾回收的要求(这里为什么不满足我也没有弄清楚,只是通过实验证明是不满足,书上也这样写)
    而如果dao.select(“ddd”); 返回null时,dto就显式地指向了null,这里才满足垃圾回收的要求,new 出来的C17Dto会被回收掉。
      

  20.   

    纠正下错误,
    dto = dao.select(“ddd”); 时,如果dao.select(“ddd”); 返回一个C17Dto 对象,引用dto立马指向 这个返回的C17Dto对象,但是你原来new 出来的C17Dto对象并不会马上被回收(这里不是说垃圾回收线程有限很低的问题),主要是不满足垃圾回收的要求(这里为什么不满足我也没有弄清楚,只是通过实验证明是不满足,书上也这样写)
    这个我经过验证证实我说错了,应该是满足了垃圾回收的要求!
      

  21.   

    to:longtenggdf有区别的。
    C17Dto dto = new C17Dto(); 新创建了一个对象。
    dto = dao.select(“ddd”); 将dto对象的引用指向 dao.select(“ddd”)返回回来的对象。
    而C17Dto dto=dao.select(“ddd”); 没有创建对象。直接创建一个引用指向dao.select(“ddd”)返回回来的对象。 这是你的原话,你觉得:
    C17Dto dto = new C17Dto(); 
    dto = dao.select(“ddd”);
    与:
    C17Dto dto=dao.select(“ddd”); 
    有区别,是的,你说的区别是在过程上。我承认。
    但是请你理解下楼主的意思,楼主问的是过程么?还是结果?你不觉得你的“有区别”会误导楼主,让他认为两行代码的写法能避免Nullpoint么?
      

  22.   

     第一个 会抱错 
    短路 是指 第一个为 False 的时候 不执行 后面的  为True 他是继续执行的C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);

    C17Dto dto=dao.select(“ddd”); C17Dto dto = new C17Dto(); 是创建对象 然后 执行吧
    C17Dto dto=dao.select(“ddd”);  这样写等于是返回一个 C17Dto的实例了吧
      

  23.   

    这里何来误导~难道我说C17Dto dto = new C17Dto(); 
    新建了对象就表示可以避免空指针么?
    难道我没有说
    dto=dao.select(“ddd”);
    时dto指向了返回的对象么?难道我说了返回的对象不会是空么?
    会认为new 一个可以避免空指针只是因为没有搞清楚引用和对象关系罢了
    我也只是给楼主说明了这两个语句实质上做了什么事情罢了.
    何来误导之说~就算我说的是错的,对错自有定论,我相信楼主再看了这么多之后对这些都有更深的认识,
    也知道谁对谁错,大家发帖讨论的宗旨不就在此么?
    你不要把每个人的评论都写个"试一试再来说话".你不觉得你这样的语气让人很火大么?
      

  24.   

    to:longtenggdf我一点都不火大。您也别火大。
    上csdn都火大,那看《蜗居》不是要自焚了?问一个问题,肯定会有侧重点,就拿楼主问的第二个问题来说:
    C17Dto dto = new C17Dto();
    dto = dao.select(“ddd”);
    与:
    C17Dto dto=dao.select(“ddd”);
    谁一看都知道,第一种写法是两行代码,第二种写法是一行代码。那楼主还问这个干什么?
    你也没有这样回答他:第一种写法是两行代码,第二种写法是一行代码。
    我们回答问题都有侧重点,我的意思是,你的回答,至少让我产生了误解。你也说了,第一种写法并不能避免空指针,只是在运行时多产生一个垃圾对象而已。那为什么不能干脆果断的告诉楼主,这两种方法没有区别,让他去选择一种(上述第二种)更简洁的代码书写方式呢?实际上,在运行的最终结果上,并没有区别。运行的结果取决于dao.select的返回值。你也承认了的。
      

  25.   

    【bayougeng】和【longtenggdf】两位大侠不要在争论了,其实还是因为我问了个白痴的question。谢谢两位大侠及其他各界人士的解答。这两种方法都不可能避免空指针的发生。其实面对问题出发点不对想法不同,但我想大家心里最终的结果都是一样的。