异常
来自搞事的枣儿
异常是一种对象,运行时出现的错误会作为异常抛出。
异常类型
异常的跟类是java.lang.Throwable
异常主要有三种类型:
系统错误
- 由Java虚拟机抛出,用Error类表示
- Error 类描述的是内部系统错误。这种错误很少发生,如果发生,除了通知用户以及尽量稳妥终止程序外,几乎什么都不能做
异常
- 用Exception类表示
- 描述由于程序和外部环境所引起的错误,这些错误能被程序与捕获和处理
运行时异常
- 用RuntimeException类表示
- 描述程序的设计错误,例如类型装换,访问一个越界数组或数值错误。运行时异常通常由虚拟机抛出
Attenction:
- RuntimeException、Error以及他们的子类都成为免检异常,所有的其他异常都成为必检异常,意思是指编译器会强制程序员检查并通过try-catch块处理他们,或者在方法头声明
- 大多是情况下,免检异常都会反映出程序设计上不可恢复的逻辑错误
异常处理
Java的异常处理有三种操作:
声明一个异常
- 不显示声明Error和RuntimeException
- 在方法头显示声明所有可能发生的异常
- 关键字:throws
public void function()throws Exception
- 多个异常可以用,分隔开
public void function()throws Exception1,Exception2,...,ExceptionN
抛出一个异常
自己创建一个异常类的对象,并抛出这个对象(两种方式)Exception ex=new IllegalArgumentException("Wrong Argument");
throw ex;throw new IllegalArgumentException("Wrong Argument")
捕获一个异常
- 即当抛出异常时,try-catch块来捕获异常,并处理它,如果未捕获这跳过catch子句;当try块某语句出现异常,解析下来的语句将跳过,直接查找处理该异常的代码
- 处理异常的代码成为异常处理器
Attenction:
- 如果在父类中没有声明异常,那么就不能再子类中对其进行继承来声明异常
- 异常类至少有两个构造方法:一个是无参构造方法,一个是带可描述这个异常的String参数的构造方法。该参数成为异常消息
- catch块能捕获一个父类的异常对象,就能捕获该父类的所有子类的异常对象
- 父类的catch块不能出现在子类的catch块前,否则会出现编译错误
- 必须处理必检异常(即Error或Runtime Exception之外的异常),如果方法声明了异常,就一定要捕获或者抛出该异常
- JDK7的新特性:catch多个异常可以用|分隔开
catch(Exception1|Exception2|...|ExceptionN ex)
还有一些需要知道的
- finally子句。无论异常是否产生,finally子句中内容总会执行
- 从新抛出异常。如果不能处理某个异常,或只是简单的希望使用中注意到该异常,可以从新抛出异常
try{
statement;
}
catch(Exception ex){
//doSomething
throw ex;
}
- 通过派生java.lang.Exception类来自定义异常类
References: 《Java语言程序设计》 梁勇 著