彩击机的PracticalJava读后小记(一)

开发 后端
关于”equals()”方法,String可以随便用一用,JDK貌似很多类都没有覆写equals()方法,慎重使用。顺便一说,Object的equals()方法相当于==。

1.关于”equals()”方法,String可以随便用一用,JDK貌似很多类都没有覆写equals()方法,慎重使用。顺便一说,Object的equals()方法相当于==。自己覆写equals()方法,步骤三:<1>索引是否相等<2>是否是此类型<3>成员判断。覆写equals()方法,要覆写hashcode()方法。相等的对象必须具有相等的散列码。有些集合类都是基于散列值的,如HashMap、HashSet、Hashtable等,是根据对象的散列值将其映射到相应的散列桶。最后,当对有父类的类重写equals()方法时,注意调用super.equals()方法。

2.在把异常向上抛出时要注意,如果在catch,finallly中执行会产生异常的语句时,有可能会覆盖根源异常。

Java代码

  1. Public class Hidden     
  2. {     
  3.   public void foo() throws Exception     
  4.   {     
  5.     try {     
  6.       throw new Exception("First Exception");                 //1     
  7.     }     
  8.     catch (Exception e) {     
  9.       throw new Exception("Second Exception");                //2     
  10.     }     
  11.     finally {     
  12.       throw new Exception("Third Exception");                 //3     
  13.     }     
  14.   }     

 

3.关于throws,写清每一个异常比写一个他们的父类要好,因为捕获异常的函数也许需要针对不同的异常进行操作。

比如void f() throws FileNotFoundException, EOFException, UnsupportedEncodingException

就比void f() throws IOException 要好很多。

当调用f()的函数处理异常时,碰到第二种情况就只有去看f()的源码了。。。

这也没神马好总结的,JDK就是这么做的,大抵就是这个原因吧。

4.关于继承关于throws

Java代码

  1. interface A {     
  2. void f() throws IOException;     
  3. }     
  4. class B {     
  5.     @Override    
  6.     void f() …     
  7. }  

 

此时f()有三种选择,<1>不抛出任何异常<2>抛出IOException<3>抛出IOException的子类异常<4>有非IOException的子类异常怎么办?自己内部抓住解决之。

原因是,要是不这样,调用f()的上层方法不知道要改成神马样子,面向接口编程还怎么搞。这些其实编译器都会帮你检查的,之所以还要说是因为注意到这个问题,了解了些许原因,感觉对异常处理突然产生些许感悟。

5.关于finally,老问题随便写两句,用finally确保你的资源释放。当有finally块存在时,最好不要从try块中return,否则勿必检查finally块不会影响程序的正常返回。下面代码必须悲剧的。

Java代码

  1. int f() {     
  2.     try {     
  3.         return 1;     
  4.        } finally {     
  5.         return 2;     
  6.        }     

 

补一点,怎么才能不执行finally块中语句呢?在try块中执行到System.exit(0);语句-.-

6.关于“不要用异常控制流程”,印象中有点争议? 关键在于“流程”二字,这个流程指什么。这个流程指的是正常的程序流程,比如《Practical Java》实践24里面这个,但是异常的程序流程是可以处理的,比如网络程序socket连接连着由于网络不稳定等原因断了,捕获这个异常,进行重新连接或者连接服务镜像神马的,这个流程就是异常流程,这个不用异常控制不好处理了吧。

7.在构造函数中抛出异常,咋一看,有点怪。稍微一回忆,JDK中的Stream系列构造函数可不都是这样的么。Why?构造函数没有返回值,不能从构造函数获得传统的错误报告,一旦构造函数失败,无法从中返回错误码。这么做的好处:如果构造函数产生异常,调用段也忽略了这个异常,那么变量的索引就会指向null,使用时就会抛出NullPointerException。如:

Java代码

  1. A a = null;     
  2. try {     
  3. a = new A();     
  4. catch(XXExcption e) {…}     
  5. // 调用a     
  6. … …    

 

还有一种办法叫做二段构造法,构造函数只处理不会有异常的部分,会产生异常的部分抽离出去由另一个函数进行处理。此时就必须设置一个标志位来显示该类是否被成功的初始化,但是这造成了在调用其它函数的时候或之前必须检查此标志位(调用其它函数的时候是指检查标志位的工作在每一个“其它函数”的内部最开始的部分)。

对了,以上讨论的类像这种:

Java代码

  1. class MyFileInputStream {     
  2.     String name;     
  3.     FileInputStream fis;     
  4. }   

 

初始化name时候不会错,而初始化fis时候会有FileNotFoundException异常,不管的话会产生name有值,fis没值是null的未完全初始化的情况,导致其它成员方法的一些错误。

原文链接:http://mylazygirl-yeah-net.javaeye.com/blog/974477

8.抛出异常前先将对象恢复成有效状态,嗯,理解的不够深刻。说点别的,捕获异常并且没有继续向上抛,此时程序必须能够运行在已知的流程上,必须要正常的运行,并且不能影响下一次运行。简单说就是捕获异常需要处理,至少也要日志,对于处理不了的还是继续向上抛吧。

责任编辑:金贺 来源: JavaEye博客
相关推荐

2011-09-27 14:53:15

奔图炫彩机

2011-06-28 09:41:25

佳能一体机

2012-10-10 12:47:23

打印机佳能

2012-05-18 10:47:24

惠普激光打印机

2012-02-13 13:16:28

复合一体机推荐

2011-06-06 14:00:50

一体机行情

2012-02-06 20:36:53

复合一体机导购

2012-01-13 13:54:59

复合一体机评测

2012-06-05 11:33:12

复合一体机行情

2012-07-03 12:25:18

富士施乐复合一体机

2012-02-27 14:25:33

三星复合一体机

2011-07-09 18:32:33

复合一体机解决方案

2011-07-05 11:41:04

惠普复合一体机

2011-04-12 15:42:33

2011 IDF云计算Cloud Build

2012-03-02 16:10:51

复合一体机评测

2011-10-22 11:00:55

激光打印机评测

2012-04-09 22:16:41

Google 眼镜

2010-08-26 09:12:33

非法DHCP
点赞
收藏

51CTO技术栈公众号