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. ExpressQuantumGrid4的cxGrid的一些使用方法和经验

    使用cxGrid有一些时间了,在这里总结一下使用cxGrid的一些方法,希望给刚开始接触cxGrid的人一些帮助. 1.简单介绍:cxGrid右下方的cxGrid1Level1是表示Grid表的层,c ...

  2. 50道java算法题(一)

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   兔子的规律为数列1 ...

  3. ALV 输入数据时数字缩小一千倍的问题解决

    这个字段后面有三位小数  我输入 1 一回车 就变成了0.001 了 解决方法 DATA: wa_fieldcatalog    TYPE lvc_s_fcat,    "显示数据列内表工作 ...

  4. CODE VS1008选数

    #include<cstdlib> #include<cstdio> #include<iostream> #include<cmath> #inclu ...

  5. (译)利用ASP.NET加密和解密Web.config中连接字符串

    介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...

  6. 复习sqldataread

    public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader) { ///定义DataTable Data ...

  7. Android Canvas绘图详解(图文)

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Andr ...

  8. 【python升级录】--列表,元组

    本节内容 字符串格式化输出 数据运算 for循环 while循环 列表 元组 [字符串格式化输出] 占位符 %s—string,%d—digital,%f —float # __author:&quo ...

  9. Sql order by 和 group BY一起使用时需要注意

    ORDER BY 子句中的列必须包含在聚合函数或 GROUP BY 子句中. slect * from table group by class,id order by id slect * from ...

  10. iptables配置(/etc/sysconfig/iptables)

    iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables - ...