异常

1.异常与return

大家都知道return不再会执行函数,但是finally语句不管出现没出现异常都会被执行,那么当try或者catch语句有return的时候,finally还是否会执行呢?
	public static void testReturnAndException(){
		try {
			System.out.println("try");
			return;
		} catch (Exception e) {
			System.out.println("catch");
		}finally{
			System.out.println("finally");
		}
	}
	
	public static void main(String[] args) {
		testReturnAndException();
	}
输出如下:
try
finally
结论就是还是会执行的,finally大法好

2.异常缺失

java编程思想里面还说了个异常缺失的问题,就是在finally语句块中使用会抛出异常的函数和return语句,会使try中的异常失效,但是我发现编译器可以发现这个错误,所以我就把这个问题略过。

3.异常限制

在基类和接口中声明的异常,在子类中不可以增加异常,可以减少异常种类,因为如果子类增加了异常种类,就会失去基类的统一性。但是又分为很多种情况:

3.1 构造函数不适合异常限制

子类的构造函数需要调用父类的构造函数,所以需要捕获父类的异常,但是可以添加自己的异常:
class CException extends Exception{}
class C0Exception extends CException{}
class DException extends Exception{}
class D0Exception extends DException{}

class Father{
	Father() throws CException{
		
	}
}

class Child extends Father{
	Child() throws CException,DException{
		
	}
}

3.2 普通函数不能添加异常类型

class Father{
	Father() throws CException{
		
	}
	
	public void print() throws CException{
	}
}

class Child extends Father{
	Child() throws CException,DException{
		
	}
	
	public void print() throws CException,DException{//Exception DException is not compatible with throws clause in Father.print()
	}
}

3.3 普通函数可以减少异常类型

class Father{
	Father() throws CException{
		
	}
	
	public void print() throws CException{
	}
	public void display() throws C0Exception{
	}
}

class Child extends Father{
	Child() throws CException,DException{
		
	}
	public void display(){
	}
}

3.4 函数可以抛出异常的子类

class Father{
	Father() throws CException{
		
	}
	
	public void print() throws CException{
	}
	public void display() throws C0Exception{
	}
}

class Child extends Father{
	Child() throws CException,DException{
		
	}
	
	/*public void print() throws CException,DException{//Exception DException is not compatible with throws clause in Father.print()
	}*/
	
	public void print() throws C0Exception{
		
	}
	/*public void display() throws CException{//Exception CException is not compatible with throws clause in Father.display()
	}*/
	/*public void display(){
	}*/
}

3.5 像上转型的时候,捕获父类的异常

Child child = null;
		try {
			child = new Child();
		} catch (CException e) {
			e.printStackTrace();
		} catch (DException e) {
			e.printStackTrace();
		}
		
		try {
			child.print();
		} catch (C0Exception e1) {
			e1.printStackTrace();
		}
		
		Father father = null;
		try {
			father = new Child();
		} catch (CException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			father.print();
		} catch (CException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}






相关内容:
前言
对象和类型
操作符和引用
流程控制语句
初始化和清理
访问控制
组合和继承
接口和多态
接口与抽象类
容器
异常
类型信息
泛型
数组
IO系统
枚举类型
注解
多线程
总结