java 异常机制

首先我们要知道java中的异常体系。
java 异常机制
这就是java的异常体系。所有的异常都继承Throwable这个类。其中Error类是java程序本身无法恢复的严重错误,应用程序不需要捕获,处理这些严重的错误。
Exception是由java应用程序抛出和处理非严重错误。我们称之为异常。
根据图我们可以很清楚的看到,异常有分为运行时异常和编译时异常。编译时异常又叫检查异常。我们在java程序中真正处理的是运行时异常。
常见的运行时异常有:
NullPointerException: 空指针异常;简单的说就是调用了未经初始化的对象或者不存在的对象,或是访问或修改了null属性和方法。
ClassNotFoundException: 类没有找到异常。1 .的确不存在该类 2.开发环境进行了调整,如目录结构发生了变化。3.在修改类名时,没有修改调用该类的其他类。导致类找不到的请情况。
IllegalArgumentException: 向方法传递了一个不合法或不正确的参数。
InputMismatchException: 输入的内容与期望的类型不匹配。或者该内容超出期望类型的范围。
IllegalAccessException: 当应用程序试图创建一个实例,设置或获取一个属性,或者调用一个方法,但当前正在执行的方法无法访问制定类、属性、方法或构造器的定义时,就抛出这样的异常。
ClassCastException: 当试图将对象强制转换为不是实例的子类时,抛出该异常。
SQLException: 数据库访问错误或其他信息的异常
IOException: IO异常
异常处理机制:
java当中目前有两种异常处理机制:
第一种:一抛到底;我们将异常抛出,调用该方法的方法也要进行抛出(用关键字throws,将异常提交给调用该方法的方法进行处理,一般只用在方法上)
第二种:处理异常,try {} catch(){} finally{};用这个来处理异常,将有可能出错的代码写在try里面,catch里面是提示我们是什么错误,finally里面的代码是一定会被执行的(finally是个可选项)。Try后面可以跟多个catch(原则是从小到大诊断异常)。
抛出异常里面还有个手工抛出异常。就是这个异常是我们自己定义的:
手工抛出异常: throw new 异常类型(“需要提示的异常信息”); 然后我们在catch 语句块可以捕获我们手工抛出的这个异常。当然我们也可以在catch里面继续抛出这个异常(只需要我们在catch里面这样写:throw e)。
手工抛出异常代码如下:


public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("我");
		try {
			System.out.print("喜");
			//抛出一个空指针异常,制定信息为"欢"
			throw new NullPointerException("欢"); 
		}catch(NullPointerException e) {
			System.out.println(e.getMessage());
		}
		System.out.print("java");
	}
}

运行结果:
java 异常机制
如果想要再次将这个空指针异常抛出的话,只需要在catch子句中去掉 System.out.println(e.getMessage()); 加上一句 throw e;就ok了。
自定义异常类:
这个在java中也很常见:
很多时候我们都喜欢用自己定义的一些东西。那么,异常类也不例外。
假设我们定义这样一个异常类,当年龄大于100或这小于0的一个异常类。
异常类代码(必须继承Exception这个类
):

/***
 * 当设置的年龄超过设定的范围是就抛出这个异常信息
 * @author tuofafa
 *	return 返回这个提示
 */
public class AgeException extends Exception {
	private String message;
	//自定义异常类的构造方法
	public AgeException(int age) {
		message = "年龄设置为:"+age+"不合理";
	}
	//自定义异常类的toString方法
	public String toString() {
		return message;
	}
}

自定义异常类的使用
我们通过person 类和Test类来演示一下:
首先来看一下Person类:

public class Person {
	private int age;
	public int getAge() {
		return age;
	}
	//声明这个方法可能会抛出我们自定义的这个异常类
	public void setAge(int age)throws AgeException {
		if(age <=0 || age>100) {
			//抛出我们自定义的这个类
			throw new AgeException(age);
		}else {
			this.age = age;
		}
	}
}

Test类:

public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person();
		Person p2 = new Person();
		//不会抛出异常
		try {
			p1.setAge(88);
		} catch (AgeException e) {
			// TODO Auto-generated catch block
			System.out.println(e.toString());
		}
		//会抛出异常
		try {
			p2.setAge(110);
		} catch (AgeException e) {
			// TODO Auto-generated catch block
			System.out.println(e.toString());
		}
	}
}

这就是自定义异常类及如何使用自定义异常类的过程:
最后就是Try catch finally 的执行顺序:
先执行try中的代码块;(finally中的代码块是无论如何都要执行的)。如果try中的代码块没有出错,则执行完try中的代码块以后会去执行finally中的代码块。如果try 中的代码块出错,则会去处理catch 中的代码块,执行完catch中代码块以后,会去执行finally中的代码快。
Try—catch—finally中都有return语句,执行的结果情况;
无论如何,最终都是以finally中的return返回值为结果。因为finally语句不管程序有没有异常都会去执行,所以最终返回的肯定是finally中的return语句。如果finally中没有return语句,那就得分情况而讨论:
第一:try语句块中没有出现异常,则try中的return语句是最终的返回值(return后,执行finally)。
第二:try语句块中如果出现异常,则catch中的return语句是最终的返回值(return后,执行finally)。
欢迎各位批评指正……