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. [第三方]SCNetworkReachability 获取网络状态控件使用方法

    用Cocoa Pods导入控件以后 直接导头文件 复制以下代码 [SCNetworkReachability host:@"github.com" reachabilityStat ...

  2. 常用js学习

    http://www.cnblogs.com/qiantuwuliang/tag/js/

  3. 【python】lxml处理命名空间

    有如下xml <A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dat ...

  4. iOS-JavaScript向WKWebView传值

    一.本地代码所需操作 1.创建viewController并遵守协议 @interface ViewController ()<WKNavigationDelegate,WKScriptMess ...

  5. August 9th 2016, Week 33rd Tuesday

    Tomorrow is never clear, our time is here. 明天是未知的,我们还是要过好当下. Tomorrow is not unpredictable, it is cl ...

  6. NYOJ题目872开会

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsoAAAKwCAIAAAAOTc6wAAAgAElEQVR4nO3dO3LcSpOG4dkEfS6Edi

  7. 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型

    5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...

  8. 与你相遇好幸运,Sails.js自定义responses

    在 /api/responses/ 新建文件 >serviceDBError.js 自定义的数据库错误 >serviceError.js  自定义的数据错误 >serviceSucc ...

  9. 【翻译十三】java-并发之饥饿与活锁

    Starvation and Livelock Starvation and livelock are much less common a problem than deadlock, but ar ...

  10. 那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传

    一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form s ...