Java Exception

523 阅读3分钟

一. 异常的体系结构

java.lang.ThrowableError: 错误, 程序中不进行处理
    	② Exception: 异常, 要求在编写程序时, 就要考虑到对这些异常的处理
    		Ⅰ. 编译时异常: 在编译期间会出现的异常(执行javac.exe命令时, 出现的异常)
        	Ⅱ. 运行时异常: 在运行期间出现的异常(执行java.exe命令时, 出现的异常)

当执行一个程序时, 如果出现异常, 那么异常之后的代码就不再执行!

二. 如何处理Exception的异常

Java提供的是异常的抓抛模型

1. "抓": 抓住上一步抛出来的异常类的对象. 如何抓? 即为异常处理的方式, 有两种:
	① try-catch-finally
	② throws + 异常类型

2. "抛": 当我们执行代码时, 一旦出现异常, 就会在异常的代码处生成一个对应类型的对象, 并将此对象抛出(自动抛出 / 手动抛出(throw + new 异常类))
    	一旦抛出此异常类的对象, 那么程序就终止执行
        此异常类的对象抛给方法的调用者
	java提供了两种方式用来处理一个异常类的对象

异常类, 既可以是现成的异常类, 也可以是自己创建的异常类

三. 异常的处理方式:

方式一:

	try{
		// 可能出现异常的代码
	}catch(Exption1 e1){
		// 处理方式一
	}catch(Exption2 e2){
		// 处理方式二
	}finally{
		// 一定要执行的代码
	}
  
    注:
        ① try 内声明的变量, 类似于局部变量, 除了 try{} 语句, 就不能被调用
        ② catch 语句内部是对异常对象的处理: e.getMessage(); e.printStackTrace()
        ③ 可以由多个 catch 语句, try 中抛出的异常类对象从上往下去匹配 catch 中的异常类的类型, 一旦满足就执行 catch 中的代码. 执行完, 就跳出其后的多条 catch 语句
        ④ 如果异常处理了, 那么其后的代码继续执行
        ⑤ 若 catch 中多个异常类型是"并列"关系, 那么顺序前后都可以. 若 catch 中多个异常类型是"包含"关系, 须将子类放在父类的之前, 进行处理. 否则报错
        ⑥ finally 是可选的
        ⑦ finally 中存放的是一定会被执行的代码不管 try 中、catch 中是否仍有异常未被处理, 以及是否有 return 语句
        ⑧ try-catch 是可以互相嵌套的

方式二: 
	
    ① 在方法的声明处, 显式的抛出该异常对象的类型
    ② 格式: 如: public static void method() throws Exception{}
    ③ 当在此方法内部出现异常的时候, 会抛出一个异常类的对象, 抛给方法的调用者
    ④ 异常的对象可以逐层向上抛, 直到main中. 当然在向上抛出的过程中, 可以再通过 try-catch-finally进行处理
    

对于运行时异常来说, 可以不显式的进行处理

对于编译时异常来说, 必须要显式的进行处理

四. 如何自定义一个异常类

	① 自定义的异常类继承现有的异常类
	② 提供一个序列号, 提供几个重载的构造器
	public class MyException extends Exception{
    
		static final long serialVersionUID = -70348975766939L;
        
		public MyException(){}
        
		public MyException(String msg){
			super(msg);
		}
	}

子类重写的父类的方法, 其抛出的异常类型只能是被重写的方法的异常类的子类或本身

其中, 要区分: throw 与 throws 的区别