聪明出于勤奋,天才在于积累。――华罗庚
本讲内容:异常处理
一、基本概念
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用……)时,java就会用异常对象来描述。
二、java中用2种方法处理异常:
1、在发生异常的地方直接处理意见;try--catch
2、将异常抛给调用者,让调用者处理(都抛上一级最终是虚拟机处理);throws Exception
三、异常分类(也可分检查性异常和非检查性异常)
1、检查性异常:java.lang.Exception
2、运行期异常:java.lang.RuntimeException
3、错误:java.lang.Error
java.lang.Exception、java.lang.RuntimeException、java.lang.Error都是java.lang.Throwable的子孙类。java.lang.Exception和java.lang.Error继承java.lang.Throwable,而java.lang.RuntimeException继承java.lang.Exception
下面是非检查性异常(Error及其子类和RuntemeException及其子类)
| 异常 | 异常对应的运行错误 |
| ArithmeticException | 算术错误,譬如被0除 |
| ArrayIndexOutOfBoundsException | 数组下标越界 |
| ClassCastException | 无效的类型转换 |
| EmptyStackException | 空栈异常 |
| IndexOutOfBoundsException | 某些类型的下标越界 |
| NegativeArraySizeException | 用负数创建数组 |
| NullPointerException | 使用空引用错误 |
| NumberFormatException | 字符串到数字格式的无效转换 |
| StringIndexOutOfBounds | 尝试在一个字符串边界之外进行索引 |
下面是检查性异常(Exception及其除RuntemeException以外的所有子类)
| 异常 | 异常对应的运行错误 |
| ClassNotFoundException | 未找到欲装载的类 |
| CloneNotSupportedException | 尝试复制一个没有实现Cloneable接口的对象 |
| FileNotFoundException | 未找到指定的文件或目录 |
| IllegalAccessException | 对一个类的访问被拒绝 |
| IOException | 输入、输出错误 |
| InterruptedException | 线程在睡眠、等待、或因其他原因暂停时被其他线程打断 |
下面我们通过例子感受一下
try-catch-finally语句
package a;
import java.io.*;
import java.net.Socket;
public class Text {
public static void main(String[] args) {
FileReader fr=null;
try {
//打开文件
fr=new FileReader("d:\\aa.txt");
System.out.println("在出现异常的地方,就终止执行代码,然后进入到catch,如果有多个catch语句,则进入匹配异常那个catch");
//连接一个192.1682.22.3 ip的端口号5037
// Socket s=new Socket("192.1682.22.3",5037);
} catch (Exception e) {
//把异常的信息输出,利于排除bug
e.printStackTrace();
}finally{
//这个语句块,不管有没有异常,都会执行,一般把需要关闭的资源写在这(文件、连接、内存……)
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
java.io.FileNotFoundException: d:\aa.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileInputStream.(FileInputStream.java:66)
at java.io.FileReader.(FileReader.java:41)
at a.Text.main(Text.java:11)
finally是可选的,这个语句块,不管有没有异常,都会执行,注意:try子句后至少应该有一个catch子句或者finally子句。在finally子句中,通常可以进行资源的清除工作。譬如关闭文件。
以下情形,finally块将不会执行:
1、finally块中发生了异常;
2、程序所在线程死亡;
3、在前面的代码中用了System.exit();
4、关闭CPU
五、throws Exception
package a;
import java.io.*;
import java.net.Socket;
public class Text {
public static void main(String[] args) {
Father f=new Father();
f.sleep1();
}
}
class Father{
private Son son=null;
public Father() {
son=new Son();
}
public void sleep1() {
try {
son.sleep2();
} catch (FileNotFoundException e) {
System.out.println("父调用者处理异常");
e.printStackTrace();
}
}
}
class Son{
public void sleep2() throws FileNotFoundException {
FileReader fr=new FileReader("d:\\aa.txt");
}
}
父调用者处理异常
java.io.FileNotFoundException: d:\aa.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileInputStream.(FileInputStream.java:66)
at java.io.FileReader.(FileReader.jav