Java学习(十)
异常处理
异常的三个种类:
- 检查异常:检查异常通常是用户错误或者不能被程序员所预见的问题
- 运行时异常:运行时异常是一个程序在运行中可能发生的、可以被程序员避免的异常类型
- 错误:错误不是异常。是用户和程序员无法控制的问题。错误通常在代码中被忽略,虽然想在程序中来修复这个问题,但是对一个错误很少能有所作为。错误在程序中发生时类似于异常。异常和错误都能使我们的应用程序崩溃
异常的控制流程
异常是被一个方法抛出的对象。当一个方法被调用时这个方法被压入到内存的方法调用栈中。 当一个方法抛出异常是该方法从调用栈被弹出,同时产生的异常对象抛给了栈中的前一个方法。对异常的处理,方法有三个选择:
- 捕获异常,不让他沿着栈继续向下抛出
- 捕获异常,并继续向下抛出
- 不捕获异常,异常对象继续抛给调用栈下面的main()方法
无论调用栈中有多少方法,程序控制流程都会继续在调用栈中向下执行。在调用栈中没一个方法要么捕获处理这个异常,要么捕获并再次抛出,或者直接什么不做让他进入下一个方法
Throwable类
只有Throwable类的对象能被JVM抛出。他有两个子类Exception和error。Error是所有Java错误类的父类,严重的不可恢复性。Exception是所有异常的父类,包括运行时异常和检查异常
捕获异常
在Java中,通常使用 try和catch关键字来捕获异常。用try/catch关键字把可能产生异常的代码包裹起来,其中的代码称为被保护代码。try{//被保护的代码}catch(异常的名称 e){//捕获块}
catch语句包含我们想要捕获的异常的类型声明。如果try块中发生异常,catch块就会对这个异常进行检查,如果异常类型和catch语句中所列出来的,那么异常对象就会被传到catch块中。简易的说就是try中发生异常时直接跳入catch中,如果正常执行,catch就不会执行。
还有一种语法try{}catch(){}finally{}
finally是最终执行的,不论前面怎样都会执行,一般用于关闭资源
多个catch块
在被保护的代码产生了多个不同类型的异常时,try后面都会跟随多个catch块,当产生异常时,会跳到对应的catch块中。
在catch块中,后一个异常必须与前一个异常同等级或是等级范围大于前一个异常的等级
异常声明和异常处理
异常处理中,除非必要,我们应当避免把语句放在受保护的代码中。尽管如此,当我们做测试是,经常会把整个程序代码放在一个可以捕获异常的大try/catch块中,这样就能避免一些不遵从异常处理或生命规则的编译错误
异常声明
如果一个方法没有处理异常,那么该方法必须使用throws关键字来声明异常。关键字必须在方法的末尾public void test()throws Exception
一个方法可以抛出多个异常之间用逗号隔开
抛出异常
关键字:throw
我们可以用throw直接抛出一个异常throw new ArrayIndexOutOfBoundsException(5)
数组下标越界异常,无效索引5。也可以先实例化一个异常再抛出ArrayIndexOutOfBoundsException e=new ArrayIndexOutOfBoundsException(5); throw e;
ps:子类不能抛出比父类更多的异常
用户自定义异常
- 所有的异常必须是Throwable的子类
- 如果我们想编写一个可以自动被异常处理或声明规则强制的检测异常,就需要继承Exception类
- 如果想写一个运行时异常就必须继承RuntimeException类