异常(Exception)的概念
异常处理
自定义异常
一、Exception 的概念
Exception 是在程序运行时打断正常程序流程的异常的情况
试图打开的文件不存在
网络链接中断
操作符越界
要加载类文件不存在
Java中定义了各种异常。Java.lang.Throwable 是这些类的父类。
![](https://img-blog.csdnimg.cn/img_convert/c07157ce49454ce090a46926542cd8a9.png)
Error:很难恢复的严重错误,一般不由程序处理。
RuntimeException:程序设计或实现上的问题,如数组越界等。
其它异常:通常是由环境因素引起的,并且可以被处理的。如文件不存在,无效URL等。
二、异常处理
扑获并处理异常
将方法中产生的异常抛出
1、扑获与处理异常
•Try 语句块
• catch 语句块
• finally 语句块
(1)Try语句块
一般形式:
try {
//一条或多条可能产生异常的java语句
Java statements
}
try 语句后必须跟随至少一个catch或finally语句块。
(2)Catch语句块
Catch语句块提供错误处理。
![](https://img-blog.csdnimg.cn/img_convert/f1220936086340818bb9fd2c2f99f7ef.png)
• SomeThrowableObject:能够被处理的异常类名,必须是Throwable类的子类
• variableName: 是异常处理程序中能够引用的代表被扑获异常的变量名称。
• Java statements: 当扑获到例外时执行的Java语句。
(3)Finally语句块
将先前方法的状态清除,并可以将控制转移到程序的其他地方。
finally 语句块无论是否发生异常都要执行。
(4)异常处理——Try ,catch和finally 语句
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering try statement");
out = new PrintWriter( new FileWriter("OutFile.txt"));
for (int i = 0; i < size; i++)
out.println("Value at: " + i + " = " + victor.elementAt(i));
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " +
e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
} }}
![](https://img-blog.csdnimg.cn/img_convert/da0d133c21fa47f39ff291f159a40a86.png)
(5)try-with-resources语句
Java SE 7以后的版本,允许在try()的括号中声明一个或多个资源(resource)对象。资源对象是指在try catch程序完成后,必须关闭的对象
确保在try catch语句结束时,自动关闭在try() 中声明的在 try-catch 语句块中使用的资源
所有实现了java.lang.AutoCloseable接口或其子接口java.io.Closeable的所有对象,可作为资源对象
try-with-resources语句也可以有catch和finally代码块,并且在所有资源对象被关闭后执行
Java SE 9允许已定义final 或等效于 final的资源变量,在 try-with-resources 的try( )语句中直接使用。等效于final的变量,是指声明时不带有final关键字,并且只被赋值一次的变量
![](https://img-blog.csdnimg.cn/img_convert/07df7d8bfb7e440cb2402f78193ba9bb.png)
多种异常的同时处理:
![](https://img-blog.csdnimg.cn/img_convert/18c1e610bc304976a4fac05ac0553746.png)
异常处理可以针对这个体系中的任意一个类。
•叶结点:是具体、专用的异常处理;
•中间结点:是通用的异常处理。可以处理该结点及其子类类型的异常。
![](https://img-blog.csdnimg.cn/img_convert/fbcbece6e7ed40cdb582712bc31de3cc.png)
2、异常处理——抛出异常
可能产生异常的方法表明将不处理该异常,而该异常将被抛到调用该方法的程序。
例:public void troublesome( ) throws IOException{
…..
}
如果一个异常在返回到main()时还未被处理,则程序将非正常终止。
![](https://img-blog.csdnimg.cn/img_convert/de0bd4fbb0e24c1798b955b3363110f4.png)
抛出异常的throw语句:
throw someThrowableObject
三、自定义异常
定义异常类,是Exception类的子类,可包含普通类的内容。
![](https://img-blog.csdnimg.cn/img_convert/596fbb3114344c5589014e3c06bb0ec4.png)