Java异常处理

前言

在程序的生命周期内,总是避免不了发生各种异常,一个好的程序必须具备良好的容错能力,以提高系统运行的可靠性。Java提供了异常处理机制来帮程序员检查可能出现的错误,保证了程序的可读性和可维护性。它将异常封装到一个类中,当出现错误时(比如打开一个不存在的文件、网络Socket连接超时等)就会抛出异常。Java类库中的每个包都定义了异常类,所有这些类都是Throwable类的子类,它派生出了Exception和Error类。其中Error类及其子类用来描述Java运行的内部错误等致命性异常,而Exception类则属于非致命类异常,通过异常处理能够使程序继续运行,因此在程序设计中用得比较多,合理地使用异常处理可以提高程序的健壮性。

Java异常处理
Java异常类继承关系结构图

基本语法

try{
	//可能运行出错的代码块
}catch(Exceptiontpe1 e1){
	//对可能出现的Exceptiontpe1的异常处理代码块
}catch(Exceptiontpe2 e2){
	//对可能出现的Exceptiontpe2的异常处理代码块
}
...
catch(Exceptiontpen en){
	//对可能出现的Exceptiontpen的异常处理代码块
}finally{
	//不管是否有异常都执行的代码块
}

点睛:try中的代码块中可以抛出多个异常,在实际运行中遇到相关的异常时就会抛出相应的异常且余下的代码块不再运行,而是跳转到相应的catch代码块。此外当代码中存在多个catch代码块时,还需要合理设计它们之间的顺序,原则是异常等级越严重放在越后面(异常的父类在子类的后面)。finally块的代码块并不是必须的,设计程序时可以省略,但是如果编写了finally块代码,那么它不管是否发生了异常都会执行。

自定义异常

如果说Java的异常机制大大提高了程序的容错能力,那么我觉得Java的异常机制提供一种优化健壮程序的能力。在程序中我们总是需要设计各种算法来满足业务逻辑的需求,此时利用Java的自定义异常设计可以减轻逻辑设计的难度。用户定义异常类只需要继承Exception类即可,使用步骤如下:

1.创建自定义异常类

2.在方法中通过throw关键字抛出异常对象

3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句进行捕获处理,否则在方法的声明出通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作(即继续把异常往外抛,但最终还是需要有异常的代码处理块)。

4.在出现异常方法的调用者中捕获并处理异常。

异常使用原则

1.在当前方法声明中使用try-catch语句捕获异常。

2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。

3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。

异常使用样例代码

public class myexception extends Exception{ //继承exception类
	public myexception(String ErrorMessage){
		super(ErrorMessage);//父类构造方法
		System.out.println("myexception异常出错打印:");
	}
}
public class myexception2 extends Exception{ //继承exception类
	public myexception2(String ErrorMessage){
		super(ErrorMessage);//父类构造方法
		//System.out.println("myexception2异常出错打印:");
	}
}

public class Myeception {
	//自定义异常,并在方法内实现异常捕获
	public int foo1(int number){
		try{
			if(number < 0){
				throw new myexception("不可以使用负数"); //抛出异常
			}
			if(number > 100){
				throw new myexception2("数值太大了");
			}
			number++;
		}catch(myexception e){
			 System.out.println(e);
		}catch(myexception2 e){
			 System.out.println(e);
		}
		return number;

	}
	//throws 关键字可以继续将异常往外抛,但终究要有方法处理
	public int foo2(int number) throws myexception,myexception2{
		if(number < 0){
			throw new myexception("不可以使用负数"); //抛出异常
		}
		if(number > 100){
			throw new myexception2("数值太大了");
		}
		return number++;
	}
}


public class Main {
	public static void main(String[] args) {		 
		 Myeception myexception = new Myeception();
		 myexception.foo1(-1);
		 myexception.foo1(101);
		 //对于往外抛的异常方法需要用try-catch执行
		 try{
			 myexception.foo2(-1);
			 myexception.foo2(101);
		 }catch(myexception e){
			 System.out.println(e);
		 }catch (myexception2 e) {
			 System.out.println(e);
		}
	}

}

总结

Java异常的使用可以增加程序设计的健壮性,特别是自定义异常的使用可以大大方便我们程序的逻辑设计,但是也需要注意Java异常使用的易错点,比如finally块的设计。

参考资料:http://www.importnew.com/26613.html