Practice 16~27

异常控制流(exceptional control flow)机制:

 try{
<block>
}
catch(<ExceptionClass> e){
<block>
throw e; //若不能处理该异常,则抛出
}
finally{
<block>
}

若在try段抛出异常,先跳过try段内异常后面的语句,执行catch段,再执行finally段,否则,执行完try段,直接处理finally段

若catch段中再次抛出异常,则抛出后依旧执行finally段

如果try里面有return语句被执行,还是会在之后执行finally段。所以在try里使用return要谨慎,最好不要用。

处理多个异常,防止被最后一个异常掩盖

一个函数当中,只有最后抛出的异常才会被调用它的函数接收

比如

class Hidden{
public static void main(String args[])
Hidden h = new Hidden();
try{
h.foo();
}
catch (Exception e){
System.out.println("In main, caught exception: " + e.getMessage());
}
public void foo() throws Exception{
try{
throw new Exception("First Exception");
}
catch (Exception e){
throw new Exception("Second Exception");
}
finally{
throw new Exception("Third Exception");
}
}
}

运行结果为:

In main, caught exception: Third Exception

再比如,在读文件的过程中:

class Hidden{
public static void main(String args[]) {
Hidden h = new Hidden();
try {
h.readFile();
}
catch(FileNotFoundException fne){
//
}
catch(IOException ioe){
//
}
}
public void readFile() throw FileNotFoundException, IOException{
BufferedReader br1 = null;
BufferedReader br2 = null;
FileReader fr = null;
try{
fr = new FileReader("data1.fil");
br1 = new BufferedReader(fr);
int i = br1.read();
//
fr = new FileReader("data2.fil");
br2 = new BufferedReader(fr);
i = br2.read();
//
}
finally {
if(br1!=null) br1.close();
if(br2!=null) br2.close();
}
}
}

调用FileReader函数可能产生FileNotFoundException,调用BufferedReader函数,close函数,可能产生IOException

若文件在FileReader的时候产生FileNotFoundException,在close的时候又产生IOException,则真正导致程序出错的原因:文件打不开 会被掩盖

这个时候,要建一个stack来储存这些exception

代码懒得打了,直接截图

较复杂的异常处理的原则:

考虑三个问题:异常发生的时候会如何?异常处理后会如何?复入这段代码会如何?

最后一个问题最难回答

可以参考database当中transaction的想法

如何处理构造对象时产生的错误

构造对象没有返回值,因此很难判断构造对象是否成功。

避免这种情况的方法有:

方法一

双阶段建构(two-stage construction),将有可能产生错误的代码移出构造函数,组成可以返回错误码的函数

方法二

双阶段建构的另一种形式

使用一个internal flag,代表这个对象建构后的有效性

方法三

在构造函数中抛出异常

异常处理的一种方法是记录异常,一种是将异常写入自己设定的文件,一种是e.printStackTrace(System.err);这个函数提供被抛异常的消息,以及该异常的起源(以stack trace方式呈现),并将它们输出到标准错误串流(standard error stream)。

finally

关于异常处理的一些tips:

1. 在finally里关闭文件,socket等,避免资源泄露

2. 在函数旁边写上 throws <ExceptionClass>,方便调用它的函数进行异常处理

3.不要在循环中使用异常处理

4. 不要用异常处理代替流程控制

5. 不要用异常处理来处理所有的出错

Practical JAVA (四)异常处理的更多相关文章

  1. Java基础(四)-异常处理机制及其设计

    本篇主要是记录自己所理解的Java异常处理机制(基于jdk1.7)以及怎么去处理和设计异常.还记得当初学习Java异常这块的时候都没怎么注意它的用途,以为就是简单的处理下异常,我避免程序出现这样错误就 ...

  2. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  3. 《practical Java》读书笔记

    题记: 花了一周把Peter Haggar的<practical Java>看了遍,有所感悟,年纪大了, 写下笔记,方便日后查看.也希望有缘之人可以看看,做个渺小的指路人. 不足之处还望指 ...

  4. Java 六种异常处理的陋习(转)

    Java 六种异常处理的陋习 原文链接:  http://www.cnblogs.com/Android-and-android/archive/2013/05/02/3054469.html 你觉得 ...

  5. Java开发知识之Java的异常处理

    Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...

  6. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  7. Java的异常处理

    Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的:       Throws: Lists the ...

  8. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  9. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  10. Pascal、VB、C#、Java四种语法对照表

    因为工作原因,自学会了vb后陆续接触了其它语言,在工作中经常需要与各家使用不同语言公司的开发人员做程序对接,初期特别需要一个各种语法的对照比,翻看了网络上已有高人做了整理,自己在他基础上也整理了一下, ...

随机推荐

  1. nyoj17_又做最大递增子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  2. c++从文件中读取特定字符串问题的总结

    1.每次从文件中读出一行作为一个字符串 可以用ifstream()函数来打开一个文件,然后用while加getline()函数即可每次读一行文件,直到文件结束 #include<unistd.h ...

  3. 【leetcode】Edit Distance (hard)

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  4. tableView性能优化

    针对滑动时出现卡的现象 参考:http://blog.sina.cn/dpool/blog/s/blog_b638dc890101ep3x.html?plg_nld=1&plg_auth=1& ...

  5. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  6. 解决eclipse中egit中的cannot open git-upload-pack问题

    一.背景 今天在使用eclipse的egit插件进行检出远程代码到本地时,出现了cannot open git-upload-pack错误,后经过努力解决该问题,记录下方便回顾和交流! 二.出现原因 ...

  7. October 1st 2016 Week 40th Saturday

    Autumn, the year's last, loveliest smile. 秋,四季流转中的最后一抹,也是最美的那一抹微笑. I love autumn because it is the h ...

  8. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。

    前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...

  9. Volley学习总结

    本文主要包括以下内容 volly基本操作(String与Json类型) volly图片操作 自定义volly volly源码分析 Volley简单易用,在性能方面也进行了大幅度的调整,它的设计目标就是 ...

  10. Python 实现发送、抄送邮件功能

    发送邮件 问题 在web.py中,如何发送邮件? 解法 在web.py中使用web.sendmail()发送邮件. web.sendmail('cookbook@webpy.org', 'user@e ...