异常:

1、格式1:

try

{

//业务代码

}

catch(Exception e)

{

//异常处理代码

}

说明:

a、   异常抛出:执行try里的代码,系统会自动生成一个异常对象,该对象会被提交给Java运行环境的过程。

b、   异常捕获:Java运行环境将接收到的异常对象与catch块匹配的过程。

c、   找不到匹配catch块,程序终止。

2、格式2:

try

{

//业务代码

}

catch(Exception1 e1)

{

//异常处理代码

}

catch(Exception2 e2)

{

//异常处理代码

}

……

说明:try后可以跟多个catch,多个catch由上至下顺序执行,所以范围大的异常放在后面,避免之前的小范围异常得不到执行机会。

3、格式3:

try

{

//业务代码

}

catch(Exception1 | Exception2| Exception3  e)

{

//异常处理代码

//如下代码错误

//e = new Exception1();

}

说明:一个catch里的参数可以包含多个异常类型,各类型间使用|号隔开,多异常的变量e有隐式final修饰,所以不能继续赋值。

4、异常信息访问:

A、   getMessage():返回异常的详细描述字符串。

B、   printStackTrace():将异常的跟踪栈信息输出到标准错误输出。

C、   printStackTrace(PrintStream s):将异常的跟踪栈信息输出到指定输出流。

D、  getStackTrace():返回异常的跟踪栈信息。

举例:

try

{

//业务代码

}

catch(Exception1  e1)

{

System.out.println(e1.getMessage());

e1.getStackTrace();

}

5、物理资源回收

try

{

//fis = new FileInputStream(“a.text”);

}

catch(Exception1 e1)

{

//异常处理代码

}

catch(Exception2 e2)

{

//异常处理代码

}

……

finally

{

//资源回收块

//fis.close();

}

说明:

A、            Java垃圾回收机制并不会回收物理资源(数据库连接、网络连接、磁盘文件等),只会回收堆内存中的无引用的对象。

B、            Try语句必须有,catch和finally语句必须有一个以上。

C、            Finally语句应该放在最后,否则其后的catch语句将失去执行机会。

D、           除非使用System.exit(1)语句,否则finally语句一定会得到执行。

6、异常处理的嵌套

说明:

A、   嵌套的层数不限,但超过两层会降低可读性。

B、   异常处理的流程可以放在任何可以放可执行代码的地方,所以try块里、catch块里,finally块里都可以嵌套。

7、自动关闭资源的try语句

try(

BufferedReader br=new BufferedReader(new FileReader(“AutoClose.java”));

PrintStream ps= new PrintSteam(new FileOutpurSteam(“a.txt”))

)

{

//业务代码

}

说明:

A、   在try后的()里可以初始化、声明一个或多个资源,语句结束时资源会自动关闭。

B、   ()里的资源须实现AutoCloseable或Closeable接口,Closeable接口是AutoCloseable接口的子接口,他们的close()方法都抛出了IOException,Java7几乎把所有资源类都实现了这两个接口。

8、Checked异常体系和Runtime异常体系

Runtime异常体系:所有的RuntimeException类及其子类的实例都是Runtime异常;

Cheaked异常体系:不是Runtime异常体系的称为Checked异常体系。

说明:Checked异常需要程序显式处理,而Runtime异常无需显式声明抛出。

9、使用throws声明抛出异常

格式:throws ExceptionClass1,ExceptionClass2……

举例1:

public class void main(String[] args) throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

说明:

a、throws声明抛出异常,自己不处理异常,让上一级调用者处理。

b、上面这段代码会将IOException异常丢给JVM处理,JVM打印异常的跟踪栈信息后,就会结束程序。

举例2:

public class void main(String[] args) throws Exception

{

test();

}

public static void test() throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

说明:IOException是一个Checked异常,方法a用throws抛出checked异常,方法b调用了a,那么,a也要用throws抛出一个异常,或者用try catch显式捕获该异常。

举例3:

public class OverrideThrows

{

public void test() throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

}

class Sub extends OverrideThrows

{

//以下是错误的

public void test() throws Exception

{

}

}

说明:

A、子类重写父类方法时throws抛出的类型,应该与父类的抛出异常相同或是该异常的子类。

B、子类重写父类方法时,抛出的异常不能比父类方法多。

10、使用throw抛出异常

格式:

throw ExceptionInstance;

说明:throw抛出的是异常实例,而不是异常类。

举例1:

try

{

//业务代码

throw new Exception(“不好”);

}

catch(Exception e)

{

//异常处理代码

}

说明:throw一次只能抛出一个异常实例。

举例2:

public static void main(String[] args)

{

try

{

throwChecked(-3);

}

catch(Exception e)

{

System.out.ptintln(e.getMessage());

}

throwRuntime(3);

}

public static void throwChecked(int a ) throw Exception

{

//业务代码

}

public static void throwRuntime(int a)

{

//业务代码

throw new RuntimeException(“异常”);

}

说明:

a、抛出的是checked类异常的话,throw语句须放在try块中,或者直接放在带throws声明的抛出的方法中。

b、抛出的是Runtime类异常的话,不一定要放在try块或者带throws的方法中。

11、自定义异常类

格式:

public class 类名 extends Exception(或者RuntimeException)

{

//无参数的构造器

public 类名 (){}

//带参数的构造器

public 类名(String msg)

{

super(msg);

}

}

说明:

a、自定义异常都应该继承Exception类或者RuntimeException类。

b、需要写如上的两个构造器,这个msg将作为异常的返回信息,也就是getMessage方法的返回值。

12、catch和throw同时使用

举例:

public 返回值 test(Sting str) throws AuctionException//这是一个自定义异常

{

try

{

//业务代码

}

catch(Exception e)

{

e.printStackTrace();//打印异常的跟踪栈信息

throw new AuctionException(“异常”);//重新抛出一个自定义异常,并调用带参数的构造器

}

}

public static void main(String[] args)

{

try

{

//假设之前已经创建了对象TE

TE.test(“hello”);

}

catch(AuctionException ae)

{

//再次捕捉test方法的异常,并且处理

System.err.println(ae.getMessage());

}

}

说明:某些异常当前方法无法完全处理,先处理一部分,然后再将异常抛给上一级调用者继续处理。

13、Java7增强的throw语句

Java7以前使用throws捕获再抛出如下:

public class Throwtest

{

public static void main(String args) throws Exception //FileNotFoundException

{

try

{

new FileOutputStream(“a.txt”);//FileNotFoundException

}

catch(Exception ex)

{

ex.pringtStackTrace();

throw ex;//注意抛出的变量类型

}

}

}

说明:Java7以前,因为throw抛出的是Exception类型,所以throws抛出的必须是Exception类型,Java7之后,可以识别到try块里只可能抛出FileNotFoundException异常,所以throws可以直接抛出FileNotFoundException异常。

14、异常链

说明:

a、这种把原始异常信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表面层,可以避免向上暴露太多的细节。

b、这种捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来的处理方式,称为异常链(23种设计模式之一:责任链模式)。

【Java】异常处理_学习笔记的更多相关文章

  1. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  2. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

  3. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  4. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  5. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

  6. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  7. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  8. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  9. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

随机推荐

  1. hdu5713 K个联通块[2016百度之星复赛B题]

    dp 代码 #include<cstdio> ; ; int n,m,k,cnt[N]; ]; ][],i,j,l,a,b; int check(int x,int y) { int i; ...

  2. tomcat7 配置

    引用:http://blog.csdn.net/mengxiangbaidu/article/details/7020484 1.安装JDK, 2.安装, apt-get install  tomca ...

  3. Azure VM上传小文件

    因为需要传一些脚本到Azure的VM里,有个简单方法可以实现,如下 编辑这个rdp文件 点击确定,连接远程计算机 可以在我的电脑里看到本地硬盘

  4. VS2013打开项目Web加载失败

    今天打开一个好久没打开过的老项目,发现web加载失败,如图: 然后重新加载项目,提示: 一开始直接在网上找答案,结果看的答案都不靠谱,只好自己动手了, 先看了 这里面是基础配置:大概看过后,又去看了提 ...

  5. Masonry 创建Button的简单使用

    代码创建控制器,控件在实际开发中很实用,方便快捷,而Masonry第三方框架更是将代码创建效率提高了很多! 如何代码创建?如何使用第三方框架? 1.首先删除系统自带的SB,详见下图 2.在AppDel ...

  6. 数据流 in redux

    之前用学过的react和react-router写了个单页面应用,但写完后总感觉还欠缺点什么,怎么说呢,就是感觉在数据流的控制上被框架约束的厉害,很不自由,比如兄弟组件间的通信就很不方便.然后才了解到 ...

  7. YbSoftwareFactory 代码生成插件【二十二】:CMS基础功能的实现

    很多网友建议在YbRapidSolution for MVC框架的基础上实现CMS功能,以方便进行内容的管理,加快前端页面的开发速度.因此花了一段时间,实现了一套CMS内容发布系统并已集成至YbRap ...

  8. struts标签

    A:<s:a xhref=""></s:a>-----超链接,类似于html里的<a></a><s:action name=& ...

  9. QFile QDataStream QTextStream

    #include <QCoreApplication> #include <QMap> #include <QFile> #include <QDir> ...

  10. javascript - 可编辑表格控件 支持全键盘操作(无JS框架)

    项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的, 自己写一个吧! 1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型 2.支持全键盘操作,自定 ...