【Java】异常处理_学习笔记
异常:
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】异常处理_学习笔记的更多相关文章
- 《深入理解Java虚拟机》学习笔记
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...
- Java:NIO 学习笔记-3
Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- Java安全防御学习笔记V1.0
Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
随机推荐
- FORM中需要反复选择LOV
注意:1.字段长度问题 2.提示显示样式:第一条记录 3.那些不现实的返回项,或者是只读的返回项可以 将从列表中验证 改为 否 比如一个LOV 返回2个值 但是其实只用选择前一个就可以带出后一 ...
- Java多线程线程学习(一)
一.操作系统级别的进程与线程1.进程: 一个计算机程序的运行实例.包含了需要执行的指令,有自己的独立地址空间,是互相隔离的.进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理.2.线程: 表 ...
- Win7下清除SQL SERVER 2008的SSMS保存的登录信息
C:\Users\{用户名}\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\
- phpcms V9 内容模型管理
[1]理解模型 模型,系统知识的抽象表示.既然抽象了,那就得脑补一下.大家都是面向对象设计的专业人员,类就很抽象的,对比类的定义想象一下模型的概念. 举个例子,一般新闻类的信息,都具有标题.内容.作者 ...
- 不安装oracle客户端,用plsql连接oracle
常用的Oracle开发的工具有SQL Developer和PL/SQL Developer,个人感觉前者虽然跨平台性优于后者,但比较大(大于300M)占用资源,而且用户体验也一般,而后者相对就小很多( ...
- Linux-wget
Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP协 ...
- IOS UIImageView的contentMode属性
红框表示imageView的frame,下面的图片是原图大小UIViewContentModeScaleToFill, 默认,对图片进行拉伸处理(不是按比例),是充满bouns UIVie ...
- 分页sql优化
如果分页sql里包含排序: select * from (...order by id) where rownum <=20 因为要排序,所以即使是分页只取20条,执行计划还是要把所有满足条件的 ...
- [课程设计]Scrum 3.3 多鱼点餐系统开发进度(下单详细信息页面设计)
Scrum 3.3 多鱼点餐系统开发进度(下单详细信息页面设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点 ...
- easyUI-combobox 动态绑定数据源
前台 <link rel="stylesheet" type="text/css" href="../css/easyui.css"/ ...