Java-异常

1.异常的定义

  异常是指程序在运行时期发生不正常的事件,它会打断指令的正常执行流程。

2.异常的分类(Throwable)

  java.lang.Throwable
     |-- Error错误:JVM造成的,如jvm系统内部错误,资源耗尽等严重问题,程序员无法处理。
     |-- Exception异常:因为编程错误或偶然的外在因素导致的一般性的问题,程序员可处理。
         |--RuntimeException:也叫非受检异常(unchecked exception).这类异常是编程人员的逻辑问题。

                                        应该承担责任。Java编译器不进行强制要求处理。 也就是说,这类异常再程序中,

                                        可以进行处理,也可以不处理。
         |--非RuntimeException:也叫受检异常(checked exception),这类异常是由一些外部的偶然因素所引起的。

                                           Error属于非受检异常,即除了该异常类,其他的都是非受检异常。

                                           Java编译器强制要求处理。也就是说,程序必须进行对这类异常进行处理。

3.常见的异常

   Error:AWTError,ThreadDeath

   RuntimeException:NullPointerException,ArithmeticException,ClassCastException,ArrayIndexOutOfBundsException

   非RuntimeException:SQLException,IOException,ClassNotFoundException,FileNotFoundException

   RuntimeException
   ArithmeticException:数学计算异常
   NullPointerException:空指针异常
   NegativeArraySizeException:负数组长度异常
   ArrayOutOfBoundsException:数组索引越界异常
   ClassNotFoundException:类文件未找到异常
   ClassCastException:造型异常:当试图将对象强制转换为不是实例的子类时,抛出该异常

       NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
IOException
   FileNotFoundException:文件未找到异常
   EOFException:读写文件尾异常
   MalformedURLException:URL格式错误异常
   SocketException:Socket异常

4.异常处理机制

  •    Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该对象将被自动提交给JVM
  •    ------这过程称为抛出(throw)异常。
  •    当JVM接收到异常对象时,会寻找能够解决这一异常的代码块,并将该异常对象交给它处理,这
  •    ------过程称为捕获(catch)异常和处理异常
  •    如果JVM找不到处理该异常对象的代码,则运行时的系统会终止,相应的Java程序也会退出。
  1. 一旦出现异常,则首先会产生一个异常类的实例化对象
  2. try语句块会对其进行捕获
  3. 产生的异常类对象会和各个catch语句里相应的异常类型匹配,匹配成功则执行相应的catch语句中的代码

     4.1 try{...}语句:这是一次捕获并处理异常的范围,只捕获最先出现的异常。会产生一种或几种类型的异常对象

     4.2 catch语句: 对异常进行处理的代码,可以有多个catch语句来处理不同类型的异常对象。

                          多重catch语句,“子上父下”,“一对一”异常子类必须在上面,而异常父类

                          在下面。它会对最先出现的异常进行捕获处理,其他之后出现的异常是不会

                          捕获的,只有一个匹配的catch语句执行,其他的不执行。如果没有异常发生

                          ,则catch语句可以忽略。

     4.3 finally语句:对异常处理的统一出口。无论try代码块中是否发生异常,finally语句块都会执行,

                            除非之前出现了System.exit(0),导致系统退出。finally语句是可选的.

                            finally语句块中经常进行资源的处理了工作:

                            1.关闭打开的文件。2.删除临时文件。3.关闭数据库的连接

 5.throws关键字

     在定义一个方法的时候可以用Throws关键字声明,表示此方法不对异常处理,交给调用该方法的地方必须进行处理

     注意:对于抛出(throws)的异常必须catch处理,或者主函数将其抛出。

 6.throw关键字

     在方法的代码块中可以用它来抛出一个异常对象。

     注意:如果throw的是一个受检异常(必须处理),则必须用throws 关键字在方法上声明抛出该异常。

7.Exception和RuntimeException

   Exception:在程序中是必须进行处理的。

   RuntimeException:(非受检异常)可以不用try....catch处理,如果出现异常,则交给JVM处理

8.自定义异常

   8.1 创建自定义异常:继承自Exception或其子类。习惯上包装一下父类的构造方法。

   8.2 使用自定义异常:

         public String[] createArray(intlength) throws  MyException {

         if (length < 0) {  throw new MyException("数组长度小于0,不合法"); }

                return new String[length];   }

   8.3

  •  观察抛出的异常的名字和行号很重要。
  •  调用JDK提供的类的方法前,阅读其API文档了解它可能会产生的异常。
  •  ----然后再根据此决定自己是应该处理这些异常还是将其加入throws列表。
  •  ----应捕获和处理那些已知如何处理的异常,而传递那些不知如何处理的异常。
  •  尽量减小try语句块的体积。
  •  在处理异常时,应该打印出该异常的堆栈信息以方便调试。

对多异常的处理:

  1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。   

      2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。       

           如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

   注意:建立在进行catch处理时,catch中一定要定义具体处理方式。不要简单定义一句 e.printStackTrace(),

            也不要简单的就书写一条输出语句。

异常在子父类覆盖中的体现;
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛

 

posted @ 2014-12-28 00:57  beyondbycyx  阅读(207)  评论(0编辑  收藏  举报