码迷,mamicode.com
首页 > 其他好文 > 详细

异常何时抛出?何时自己处理?

时间:2015-11-29 13:29:51      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

原始问题:

  关于异常中,何时在该类中处理,何时抛给调用类处理,比较纠结。比如IO中new FileInputStream(),new InputStreamReader(fStream, "UTF-8");in.readLine()等他们异常哪些本类中处理,还是都抛给调用者。

讨论:

  李:其实对于方法中的异常处理有两种方法:1、在该函数中用try...catch语句进行捕获和处理。2、直接抛出异常(这种做法有一点模糊,因为并不能确定该方法是否有异常),那么调用该方法的调用者就要处理这个方法的异常。也就是抛出异常的情况是抛给调用者去解决了。因为try..catch语句如果用的多的话,代码比较繁琐不易观看,所以才会有抛出一种异常这种做法吧 。

  胡:这样写行吗?

  

            FileInputStream fStream = null;
            InputStreamReader reader = null;
            BufferedReader in = null;
            try {
                fStream = new FileInputStream(path);
                reader = new InputStreamReader(fStream, "UTF-8");//将InputSteam转换成Reader
                in = new BufferedReader(reader);    //只提供缓冲区的包装方法
                //dosomething
            } catch (FileNotFoundException e) {
                throw e;
            } catch (SecurityException e) {
                throw e;
            } catch (UnsupportedEncodingException e) {
                throw e;
            } catch (IOException e) {
                throw e;
        }finally {
           try{ if (fStream != null) fStream.close();}catch (IOException e){log.warn("FileInputStream close failed");}
           try{ if (reader != null) reader.close();}catch (IOException e){log.warn("InputStreamReader close failed");}
           try{ if (in != null) in.close();}catch (IOException e){log.warn("BufferedReader close failed");}
        }

  李:最好别嵌套写

  胡:还是根本就不拥try

  李: 要用try

  胡:直接抛给调用者。

  李:这个finally里边还有try..catch,就别这样嵌套写了

  胡: 为什么呢? 还是不管什么异常都抛给调用者。 我嵌套,是因为close也抛出异常。  不这样做的话,可能某个流没有被关闭。 所以我特别的纠结,究竟该怎么写,有没有一套规范。

  李: 像这种非运行时的异常直接抛出应该没问题

  胡: 我这样写,我又有点嫌它写的太长了。 

  李: 这样确实很繁琐

  胡:既然要抛出,索性,全部都丢给调用者。 那try也不用了。 

  李: 如果两种异常全部抛出,根据大小关系,调用者来两个catch。能行吗?

  胡:你说的意思我有点模糊

  李:  我还没试过直接抛出两种异常的代码,所以我也不清楚,调用者根据捕获的异常来处理,是否能处理呢? 

  胡: 你这个应该是能不能处理的。毕竟两种异常调用者很难去识别是哪一种异常。

    李:恩,这个有点异议, 调用者应该知道抛出的是哪种异常啊

  胡: 我的意思比如你要抛出io和math异常,那么就用throws Exception来抛出。  调用者接受的是Exception。  这样能识别出是哪种吗? 

  李: 恩,那没抛出math异常,在底层的方法里边应该用try...cathe来捕获math异常啊

  胡: 是的。

  这个问题也不知道怎么回事儿了,待大神解决。

  还有两个问题:

  1、java中垃圾回收器会自动检测不再被引用的对象,之后释放空间。释放空间之后java jvm会不会像C++给指针赋值NULL?而且java jvm快到耗尽的时候才调用垃圾回收机制,如果这时因为某些情况我必须要释放内存,自己定义finalize方法去实现,我怎么保证对象的空间一定被释放掉了?也就是finalize方法不是析构函数,是怎么被调用的?

  2、Chanel可以用于线程间的通信,还有哪些应用场合,有什么好处?

   

异常何时抛出?何时自己处理?

标签:

原文地址:http://www.cnblogs.com/lijia0511/p/5004601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!