第一个问题:
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条?)以上,谢谢
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条?)以上,谢谢
new 了一个对象.不会容易产生空指针.查不到数据的话是null
如果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了。
不会 !因为 || 是短路运算,第一个条件满足就会不会去运算后面的条件。&& 同理,第一个条件不满足也不会去运算后面的条件。
2
有区别的。C17Dto dto = new C17Dto(); 新创建了一个对象。
dto = dao.select(“ddd”); 将dto对象的引用指向 dao.select(“ddd”)返回回来的对象。而C17Dto dto=dao.select(“ddd”); 没有创建对象。直接创建一个引用指向dao.select(“ddd”)返回回来的对象。
如果dto == null,后面的就不走了。第二个问题:
C17Dto dto = new C17Dto();
dto = dao.select(“ddd”);
和
C17Dto dto=dao.select(“ddd”);
有什么区别。 没有区别。dto取决于dao.select中的写法。若返回null ,就是null。返回空集,就是空集。
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
麻烦你们亲自试一试。
我不明白,如果代码这样写:
C17Dto dto = new C17Dto();
dto = dao.select(“ddd”);
那么照你的意思,即使dao.select(“ddd”)的代码中明确返回了null,dto也不是null是吗?
dto = dao.select(“ddd”);
首先创建一个新实例对象,在堆栈中分配一个内存空间(new),然后 dao.select(“ddd”)返回一个特定的对象并将该返回的对象复制到dto中。而返回的对象无法引用,应为没有该对象的引用(在c++中就叫指针了)C17Dto dto=dao.select(“ddd”);
返回一个对象,并创建该对象的引用,此时的对象可以引用了。我是这样理解的不过第二种编译会同过吗?我还没这么用过呢
嘿嘿!动手试试,再来说话。
C17Dto dto = new C17Dto();
dto = dao.select(“ddd”);
你们是不是都以为这样写就防止抛空了?god,多一行代码而已。
dto = dao.select(“ddd”);
这样的话 dao.select(“ddd”)查不到数据 dto也不是null吗?
像try{
dto = dao.select(“ddd”);
}或者if(。){dto = dao.select(“ddd”); }
之类的,完全可以C17Dto dto = dao.select(“ddd”);
第一种完全浪费了一次资源!
请bayougeng 指教!
但明显
C17Dto dto=dao.select(“ddd”);
写法好----可能这不是楼主问题的本意,少创建一个对象!
就算返回的是null.也只是把原来指向new C17Dto();的引用指向了null,而已。当你再调用dto对象的方法的时候,还是会报空异常的。
那这个 try 或if 又怎么利用这个资源了呢?
C17Dto dto = new C17Dto(); 我认为没有任何意义。
我们分情况来讨论,当你程序执行
dto = dao.select(“ddd”); 时,如果dao.select(“ddd”); 返回一个C17Dto 对象,引用dto立马指向 这个返回的C17Dto对象,但是你原来new 出来的C17Dto对象并不会马上被回收(这里不是说垃圾回收线程有限很低的问题),主要是不满足垃圾回收的要求(这里为什么不满足我也没有弄清楚,只是通过实验证明是不满足,书上也这样写)
而如果dao.select(“ddd”); 返回null时,dto就显式地指向了null,这里才满足垃圾回收的要求,new 出来的C17Dto会被回收掉。
dto = dao.select(“ddd”); 时,如果dao.select(“ddd”); 返回一个C17Dto 对象,引用dto立马指向 这个返回的C17Dto对象,但是你原来new 出来的C17Dto对象并不会马上被回收(这里不是说垃圾回收线程有限很低的问题),主要是不满足垃圾回收的要求(这里为什么不满足我也没有弄清楚,只是通过实验证明是不满足,书上也这样写)
这个我经过验证证实我说错了,应该是满足了垃圾回收的要求!
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么?
短路 是指 第一个为 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的实例了吧
新建了对象就表示可以避免空指针么?
难道我没有说
dto=dao.select(“ddd”);
时dto指向了返回的对象么?难道我说了返回的对象不会是空么?
会认为new 一个可以避免空指针只是因为没有搞清楚引用和对象关系罢了
我也只是给楼主说明了这两个语句实质上做了什么事情罢了.
何来误导之说~就算我说的是错的,对错自有定论,我相信楼主再看了这么多之后对这些都有更深的认识,
也知道谁对谁错,大家发帖讨论的宗旨不就在此么?
你不要把每个人的评论都写个"试一试再来说话".你不觉得你这样的语气让人很火大么?
上csdn都火大,那看《蜗居》不是要自焚了?问一个问题,肯定会有侧重点,就拿楼主问的第二个问题来说:
C17Dto dto = new C17Dto();
dto = dao.select(“ddd”);
与:
C17Dto dto=dao.select(“ddd”);
谁一看都知道,第一种写法是两行代码,第二种写法是一行代码。那楼主还问这个干什么?
你也没有这样回答他:第一种写法是两行代码,第二种写法是一行代码。
我们回答问题都有侧重点,我的意思是,你的回答,至少让我产生了误解。你也说了,第一种写法并不能避免空指针,只是在运行时多产生一个垃圾对象而已。那为什么不能干脆果断的告诉楼主,这两种方法没有区别,让他去选择一种(上述第二种)更简洁的代码书写方式呢?实际上,在运行的最终结果上,并没有区别。运行的结果取决于dao.select的返回值。你也承认了的。