1 异常概述
-
3类错误
- 编译错误
- 逻辑错误
- 运行时错误:在程序运行过程中如果发生了一个不可能执行的操作,就会出现运行时错误。
-
异常:异常实际上是程序中错误导致中断了正常的指令流的一种事件
- 异常是一个可以正确运行的程序在运行中可能发生的错误。
-
异常特点
- 偶然性:程序运行中,异常并不总是会发生。
- 可预见性:异常的存在和出现是可以预见的。
- 严重性:一旦异常发生,程序可能终止,或者运行的结果不可预知。
-
异常处理 ( Exception Handling ):提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。
2 java异常类/异常的层次结构
java异常类
- Error:由Java虚拟机生成并抛出,Java程序不做处理
- Runtime Exception:编译时不可监测的异常,由系统检测, 用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序。
- 非Runtime Exception:编译时可以监测的异常,Java编译器要求Java程序必须捕获或声明所有的非运行时异常,可以通过try-catch或throws处理。
- throw:用户自己产生异常。
常见的异常
- ArithmeticException
- ArrayIndexOutOfBandsException
- ArrayStoreException
- IOException
- FileNotFoundException
- NullPointerException
- MalformedURLException
- NumberFormatException
- OutOfMemoryException
异常分类
- 非受检异常 ( unchecked exception ) :包括 Runtime Exception 及其子类、Error 及其子类。
- 这些异常只能在程序执行时被检测到,不能在编译时被检测到;
- 程序对这类异常可不做处理,交由系统处理。
- 受检异常 ( checked exception ):除了非受检异常之外的异常(即其他的异常类都是可检测的类)
- 这些异常在编译时就能被java编译器所检测到异常。
- 必须采用 throws 语句或者 try-catch 方式处理异常
3 java异常处理机制
- 抓抛模型
- 抛出(throw)异常:Java程序在正常的执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,且其后代码就不再执行。
- 关于异常对象的产生
- 系统自动生成异常对象
- 手动生成一个异常对象,并抛出(throw)
- 关于异常对象的产生
- 捕获(catch)异常:可以理解为异常处理方式。
- try-catch-finally
- throws
- 抛出(throw)异常:Java程序在正常的执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,且其后代码就不再执行。
- Java语言按照面向对象的思想来处理异常:
- 把各种不同类型的异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。
- 用throws语句在方法声明处声明抛出特定异常。(只抛出不处理,交给调用该方法的方法进行处理,若一直不处理,则交给系统处理)
- 用try-catch语句来捕获并处理异常。(处理)
- 用throw语句在方法中抛出具体的异常。(自定义异常)
4 try-catch-finally
finally:无条件执行的语句
public class ExceptionTest2 {
public static void main(String[] args){
System.out.println("这是一个异常处理的例子\n");
try{
int i=10;
String[]str={"I","Like","Java"};
str[5]="Hel1o";
i/=0;
// str[5]="Hel1o";
} catch(ArithmeticException e){
System.out.println("异常是:"+ e.getMessage());
} catch(IndexOutOfBoundsException e){
System.out.println("异常是:"+ e.getMessage());
}finally {
System.out.println("finally 语句被执行!");
}
System.out.println("Everything is fine!!!");
}
}
这是一个异常处理的例子
异常是:Index 5 out of bounds for length 3
finally 语句被执行!
Everything is fine!!!
try{}中执行return,finally语句仍然执行,在return前执行
try{}中执行exist(0),finally语句不执行
try-catch-finally 语句格式
-
一个try一个catch可以,一个try一堆catch也可以,try-catch-finally也可以,try-fianlly也可以
-
try-catch-finally语句的语法格式- 一般
finally写释放资源的部分(打开水龙头后无论水龙头能不能使最后都要关上水龙头) - 如果一个异常类和其子类都出现在catch子句中,应把子类放在前面,否则将永远不会到达子类。
- 一般
try {
// 接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理;
}
catch (ExceptionType1 e) {
// 抛出ExceptionType1异常时要执行的代码
}
catch (ExceptionType2 e) {
// 抛出ExceptionType2异常时要执行的代码
}……
[finally {
// 无条件执行的语句
}]
try-finally
//try-finally
try{
// 对文件进行处理的程序
}
finally{
// 不论是否发生异常,都关闭文件
}
catch(异常名1|异常名2|异常名3 变量)
try{
}catch(异常名1 |异常名2 |异常名3… 变量){
}
方法虽简洁,但是也不是特别完美
- 上述异常必须是同级关系;
- 处理方式是一样的(针对同类型的问题,给出同一个处理)
try-with-resourse
- 资源:所有实现Closeable的类,如流操作,socket操作,httpclient等
- 打开的资源越多,finally中嵌套的将会越深,所以引入了 Try-with-resourse
- 带资源的try语句(try-with-resource)的最简形式为:
try(Resource res = xxx){ // 可指定多个资源
work with res
}
- 处理规则
- 凡是实现了AutoCloseable接口的类,在try()里声明该类实例的时候,在try结束后,close方法都会被调用;
- try结束后自动调用的close方法,这个动作会早于finally里调用的方法。
- 不管是否出现异常,try()里的实例都会被调用;
- close方法越晚声明的对象,会越早被close掉。
例1
例2
do something
resource is closed
例3
先声明的后关闭
do something
do other things
other resource is closed
some resource is closed
5 Throws
用于声明异常。
-
声明异常:一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常。
-
Throws语句用来表明一个方法可能抛出的各种异常,并说明该方法会抛出但不捕获异常
-
声明异常的格式
<访问权限修饰符><返回值类型><方法名>(参数列表) throws 异常列表{}
-
当父类中的方法没有throws,则子类重写此方法时也不可以throws。若重写方法中出异常,必须采用try结构处理。
-
重写方法不能抛出比被重写方法范围更大的异常类型,子类重写方法也可以不抛出异常。
-
若最终方法也没有处理异常,异常将交给系统处理
例
6 throw与创建自定义异常类
- 不是由Java系统监测到的异常,而是由用户自己定义的异常
- 用户定义的异常必须由用户自己抛出
throw new MyException - 语句格式
<class><自定义异常名>extends<Exception>{
…
}
throw
- throw抛出异常主要用于自定义异常。
- throw的语句格式为:
<throw><异常对象> - 程序会在throw语句处立即终止,转向 try…catch 寻找异常处理方法。














