学习笔记十九:异常处理(一)

2015-01-25 19:37:24 · 作者: · 浏览: 9

聪明出于勤奋,天才在于积累。――华罗庚

本讲内容:异常处理

一、基本概念

当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用……)时,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