黑马程序员(九) 异常及常见异常总结

来源:互联网 发布:linux大学时候开发 编辑:程序博客网 时间:2024/06/17 11:17

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

异常

异常: 就是不正常,是指程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。


异常体系:

          Throwable

                 |--Error 严重的问题,是处理不了的。要改正代码的。

                 |--Exception

非RuntimeException的,是需要处理的。编译期异常。

         |--RuntimeException 不需要处理的,是需要改代码的。运行期异常。

           举例:

                 Error:

                      地震,海啸。

                 Exception:

                      感冒了,头疼。

           注意:

                 每种体系的子类都是以父亲的名称作为后缀。

                 XxxError

                 XxxException

 

     java虚拟机的默认处理方式

           把异常的类名,原因,位置等信息显示在控制台。

           一旦有异常发生,其后的代码不能继续执行。

 

    异常的解决方案:

           A:自己处理

                 基本格式:

                      try{

                            可能发生异常的代码;

                      }catch(异常类名变量名){

                            异常的处理代码;

                      }finally{

                            释放资源的代码;

                      }

                 注意:一旦有一次发生,就会立马执行catch里面的代码。

 

                 变形格式:

                      try...catch

                      try...catch...catch

                      try...catch...catch...finally

                      try...finally

                

                 JDK7针对多个catch进行了优化:

                      catch(异常1 | 异常2 | 异常3 ... 变量){}

 

                     注意:这些异常必须是平级关系。

                            和try...catch...catch的不同点是

                            JDK7的这种方案是必须平级关系,不能有子父关系。

                            而try...catch...catch父亲放最后是可以的。

          B:抛出处理

                 用throws关键字在方法上声明(抛出)。

 

          C:到底使用谁?

                 a:能处理的尽量处理。(一般用try...catch)

                 b:不会就抛


我的总结:能出来的异常先自己处理,不会处理再抛给虚拟机处理

  

 finally关键字

异常的统一出口:

不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。

try语句块或会执行的catch语句块使用了JVM系统退出语句例外;//System.exit(1);

try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。

不要在finally中使用return 或throw语句,否则将会导致try、catch中的return或throw失效。


我的总结:finally代码块只在一种情况下不执行:System.exit(0)


     Exception和RuntimeException的区别?


           A:Exception编译时期异常,必须处理的。

                     如果在方法上,throws了该类型的异常,将来调用者必须处理。

                     如果在方法内部,throw了该类型的异常,必须在方法上throws该异常。


           B:RuntimeException运行时期异常,是不需要处理的。要改代码的。

                     如果在方法上,throws了该类型的异常,不需要处理。

                     如果在方法内部,throw了该类型的异常,方法上可以throws该异常,也可以不throws该异常。


 

    throw和throws的用法和区别?

           A:throw

                 用法:用在方法内部,后面跟的是异常对象名称。


                 区别:用throw抛出了编译时期异常,方法上面必须用throws抛出。


                       用throw抛出了运行时期异常,方法上面可以不用throws抛出。


           B:throws

                 用法:用在方法声明上,后面跟的是异常类名。


                 区别:用throws在方法上声明了异常,内部可以没有throw


常见异常总结:


ArithmeticException(除数为零异常)


ArrayIndexOutOfBoundsException(数组角标越界异常)

IndexOutOfBoundsException(索引越界异常,访问不存在索引时出现)


NullPointerException(空指针异常,当对象为null时,调用对象的方法会出现此异常)


ClassCastException(类型强制转换异常,把A类型强制转换成B类型会出现此异常,一般出现在多态中)


FileNotFoundException(文件未找到异常,当创建输入流读取文件时,如果文件不存在就好出现此异常)


IOException(输入输出异常)


NoSuchFieldException(属性不存在异常,当访问某个类不存在的的属性会出现)


NoSuchMethodException(方法不存在异常,当访问某个类不存在的的方法会出现)

0 0