整理java异常机制

java中的所有异常都是ThrowAble的子类。ThrowAble又分为:

  • error
  • Exception

error这里暂时先不做研究,Exception又分为:

  • 运行时异常(Runtime)
  • 编译时异常

用代码来体现下两种异常的区别
下面为代码抛出运行时异常,方法在编译时没有任何问题

	public void testRuntimeException(){
		throw new RuntimeException();
	}

如果在代码中主动抛出其他类型异常(不是RuntimeException及其子类),在编译时就会报错 必须使用try catch 或者在方法上抛出异常。

	//编译报错
	public void testOtherException(){
		//激活接口所使用的一般异常,(这里随便在api里面找的)
		throw new ActivationException();
	}
	//方法上显示抛出,让调用此方法者处理此异常
	public void testOtherException2() throws ActivationException{
		//激活接口所使用的一般异常,(这里随便在api里面找的)
		throw new ActivationException();
	}
	//本层处理掉此异常,不向上层抛出
	public void testOtherException3(){
		//激活接口所使用的一般异常,(这里随便在api里面找的)
		try {
			throw new ActivationException();
		} catch (ActivationException e) {
			//打印调用栈
			e.printStackTrace();
		}
	}

这里还涉及到一个异常传递的问题,如果是编译时异常,则每层都会且必须显示处理这个异常。但是对于RuntimeException代码如下:

public class TestException {
	static void testException() {
		try {
			throw new RuntimeException();
		} catch (Exception e) {
			System.out.println("捕获");
			throw e;
		}
	}

	static void testException2() {
		testException();
		System.out.println("正常执行");
	}

	public static void main(String[] args) {
		try {
			testException2();
		} catch (Exception e) {
			System.out.println("main中捕获");
		}
	}
}

对于上面这段代码,在testException方法中,显示的捕获了运行时异常,处理过后重新抛出,由于是运行时异常,所以不需要像编译时异常一样,必须在方法名后面加上throws 异常。如果在testException中在catch语句块中没有重新throw异常,则testException2中正常执行。如果在main函数中不显示的try catch 异常,则程序直接抛出异常到界面显示给用户。
这里还涉及到一个finally语句块,由于finally语句块程序在基本情况下都会在最后运行,一般用来释放掉一些必须释放掉的资源,如数据库连接等。这里注意一个事情,代码如下:

public class TestException {
	static int test() {
		int i = 0;
		try {
			throw new RuntimeException();
		} catch (Exception e) {
			System.out.println("捕获");
			i = 5;
			throw e;
		} finally {
			return i;
		}
	}
	
	static void test2(){
		int i = test();
		System.out.println(i);
	}

	public static void main(String[] args) {
		test2();
	}
}

注意:如果在finally语句块中,使用return 语句,则在catch 语句块中重新抛出的异常就会失效。在外层调用test方法时,效果与在catch语句块中不重新抛出异常效果相同,test2方法正确执行。
如果finally语句块中不使用return 语句,在main方法中也没有显示的处理异常, 程序直接抛出异常。
现在finally语句块中使用return语句,就会导致异常抛出失效(throw e 失效) test2函数正常执行打印功能 打印 i= 5

posted @ 2017-03-14 22:20  江湖小_虾  阅读(104)  评论(0)    收藏  举报