异常 https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html

常用方法:
	* void	printStackTrace():打印堆栈信息
		打印异常信息 + 异常产生原因

1. 异常体系

异常是在程序中断运行是的一种指令流,如:文件找不到、非法参数、网络超时...
为保证程序正常运行,设计程序是必须考虑到各种异常情况,并对异常进行处理。

* 异常也是一种对象,Java中有许多异常类,并且定义了基类  java.lang.Throwable,
* 它是所有异常的超类。

异常分为两种:Error和Exception

Error:程序无法处理
	有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。
	比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。
	这类错误不可查,非代码性错误,应用不应该去处理此类错误。
	
Exception:程序可以捕获和处理
	1. 运行时异常(不受检异常):运行时
		* NullPointerException
		* ArrayIndexOutBoundException
	2. 编译异常(受检异常):
		* IOException

2. 异常处理流程

1. 抛出异常:一个方法出现错误引发异常,该方法会将该异常类型以及一场出现的程序状态信息
封装为异常对象,交给本应用。该应用寻找处理异常的代码执行,任何代码都可以通过throw抛出。

2. 捕获异常:一旦方法抛出异常,系统自动根据该异常对象寻找异常处理器(Exception Handler)
处理该异常

1. Error  =》  JVM处理
2. 可查异常   =》   捕获   或者  抛出 

2.1 捕获异常

try-catch

try {
      //监控区
    }catch (ExceptionType1 e) {
       //捕获并处理ExceptionType1的异常
    }catch(ExceptionType2 e) {
       //捕获并处理ExceptionType2的异常
    }

监控区一旦发生异常,则会根据当前运行时的信息创建异常对象,并将该异常对象抛出监控区,同时系统根据该异常对象依次匹配catch子句,运行其中catch代码块中的异常处理代码,一旦处理结束,那就意味着整个try-catch结束。

try-catch-finally

try {
       //监控区
   }catch (ExceptionType1 e) {
       //捕获并处理ExceptionType1的异常
   }catch (ExceptionType2 e){
       //捕获并处理ExceptionType2的异常
   }finally{
       //一定会执行
   }

try块中发生异常后抛出,异常后面的语句不会被执行
不要在finally块中有return,不要通过catch来控制代码流程

2.2抛出异常

1. throws抛出异常:在方法名上
	产生异常的方法没有能力处理,交给调用它的上层方法
2. throw抛出异常:在方法内
	在方法内,用throw来抛出一个Throwable类型的异常。一旦遇到到throw语句,后面的代码将不被执行
	然后,便是进行异常处理——包含该异常的try-catch最终处理,也可以向上层抛出。

* 在catch中抛出异常,这也是允许的

2.3 异常关系链

在实际开发过程中经常在捕获一个异常之后抛出另外一个异常,
并且我们希望在新的异常对象中保存原始异常对象的信息,实际上就是异常传递

2.4 异常类型转换

为了更准确的描述异常:
	将一种类型的异常转成另一种类型的异常,然后再抛出异常。
	1、 Error——>Exception
	2、 Error——>RuntimeException
	3、 Exception——>RuntimeException
class MyException extends Exception{//定义自定义异常类型
    public MyException(String msg, Throwable e){
        super(msg,e);
    }
}
public class Demo {
    public static void main(String[] args) throws MyException {
        File file = new File("D:/a.txt");
        if (file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e){
                e.printStackTrace();
                throw new MyException("文件创建失败", e);//抛出自定义异常
            }
        }
    }
}
//将自定义的异常对象抛出去,调用它的对象就可以捕获打印它的信息。

常见异常