天天看点

详解Java中的异常处理机制

Java中的异常继承体系

详解Java中的异常处理机制
/**
 * 异常可以作为判断一门编程语言是否成熟的标准,Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。
 * 当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而将"业务功能实现代码"和"错误处理代码"
 * 分离,提供更好的可读性。
 * Java的异常机制主要依靠五个关键字来实现:try catch finally throws throw
 * 
 * throws 和 throw 的区别:
				throws 用在方法定义上,紧跟方法名,用来给方法添加一个异常的声明,说明抛出的异常类型(异常可以是多个,用逗号隔开;如果多个异常之间存在继承关系,只写父类异常即可)
				throw  用在方法定义中,后面跟一个异常对象(可以是编译期异常,可以是运行期异常),用来抛出一个异常
						public void show throws Exception(){
							throw new Exception("出现异常");	//调用Exception中的带参构造
						}

						
						
	异常处理的两种方式:
		第一种:直接抛出,这种方式并未真正的处理异常,只是抛给了上层调用者
				public void show() throws 异常类名{
					可能出现问题的代码;
				}
				
		 第二种:try...catch  
 */
 


public class Demo {
	public static void main(String[] args) {
		
		/**
		 * 格式一(最常用):
		 */
		try {
			// 可能出现异常的代码块
		} catch (Exception e) { //小括号里面跟的是(异常类名  变量名)
			// 异常处理代码快,一般是打印错误信息  e.printStackTrace;处理异常的一种方式,有可能不执行
		} finally {
			//用于关闭在try代码块里面打开的物理资源,如果没有,可以不写finally
			//异常机制决定了finally块里面的代码一定会被执行
		}
		
		System.out.println("程序结束");
		
		/**
		 * 格式二:
		 */
		try {
			
		}catch(异常类型1 | 异常类型2 |异常类型3... 变量名){
			/**Exception1 | Exception2 |Exception3 为不同的异常分类
			 * 当try代码块中可能出现不同类型的异常时,我们可以在catch中针对
			 * 所有可能出现的异常都写在这儿,系统会自动匹配对应的异常进行处理
			 */
		}
		System.out.println("程序结束");
		
		/**
		 * 格式三:与格式二不同的是,格式三异常类型之间可以有继承关系,但是小的异常类型必须放在前面
		 * 		
		 * 	
		 */
		try {
			
		} catch (异常类型1 e1) {
			// TODO: handle exception
		} catch (异常类型2 e2) {
			
		} catch (异常类型3 e3) {
			
		}......
		System.out.println("程序结束");
		
		
		/**
		 * 格式四:省略catch,这种格式确认没有什么异常要抓取,此时是为了强制执行finally里面的代码
		 */
		try {
			
		} finally {
			
		}
		System.out.println("程序结束");  //由于没有处理异常,所以这段代码不会执行
		
		
		/**
		 * 注意: 1、异常处理try必须有,并且不能只有try
		 * 	  2、如果父类方法中没有异常,子类中有异常,那么子类异常不能用throws抛出,只能用try...catch...处理;
		 * 	     如果父类中有异常,子类中也有异常,并且二者异常也有继承关系,则子类异常不能大于父类异常,如果没有继承
		 * 	     关系,则异常类型随意
		 * 	  3、异常三个代码块里声明的变量都是局部变量,只在该代码块内有效
		 */
		
		/**
		 * 自定义异常:我们使用的都是jdk定义好的,但是有时候我们根据实际需要自定义异常,比如如果你不是地球人,要抛异常;
		 * 			自定义异常格式:
		 * 编译时异常: 需要定义类继承自Exception
		 * 		格式: public class 类名 extends Exception{...}
 		 * 
 		 * 运行时异常: 需要定义类继承自RuntimeException
 		 *	 	格式: public class 类名 extends RuntimeException{...}
		 */
	}
}