1.异常的定义

  异常是指程序在运行时期发生不正常事件,导致程序指令流程的无法正常执行。

2.异常的分类

   错误(error):jvm系统的内部错误资源耗尽等严重情况,属于jvm需要负担的责任

   异常(exception):编程的错误或其他外在的因素导致的一般性问题。

   注意:程序员只需要处理异常(Exception),而无法处理错误。

   黑马程序员-java-异常篇《三》_虚拟机

       Error(错误):由Java虚拟机生成并抛出,程序对其不做处理

       Exception(异常):所有异常的父类,一般需要用户显示的声明或捕获。

       RuntimException:一类的特殊异常,如被0除,,空指针数组越界等,其产生比较频繁,处理麻烦,

       如果显示的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并交将它们交给缺省的异常处理程序。

2.1异常分类(从编程的角度)

     非受检(unchecked)异常:编译器不要求强制处置的异常

              一般是指编程时的逻辑错误,程序员应当要避免的事情

              java.lang.RuntimeException 及它的子类都是非受检异常

  • 错误的类型转换:java.lang.ClassCastException

  • 数组下标越界:java.lang.ArrayIndexOutOfBoundsException

  • 空指针访问:java.lang.NullPointerException

  • 算术异常(除0溢出):java.lang.ArithmeticException

 

      受检(checked)异常:编译器要求必须处置的异常。指程序运行时由于外界因素造成的一般性异常    

  • 没有找到指定名称的类:java.lang.ClassNotFoundException

  • 访问不存在的文件:java.io.FileNotFoundException

  • 操作文件时发生的异常:java.io.IOException

  • 操作数据库时发生的异常:java.sql.SQLException

         黑马程序员-java-异常篇《三》_虚拟机_02

3.异常处理的机制

   Java程序在执行的过程中如果出现了异常,会自动生成一个异常类对象,并自动提交给JVM,这过程称为抛出(throw)异常

   JVM接收到该异常对象后,会寻找能处理该异常的代码并将该异常对象交给它处理,这过程叫做捕获异常和处理异常

   如果JVM找不到捕获该异常的代码,则运行时系统将终止,相应的Java程序也将退出。

4.try--catch--finally

    try{}:可能发生异常的代码块区域,会产生一种或几种类型的异常对象,后面的catch语句会对其进行处理

   catch():可以有多个catch语句捕获多种类型的异常,但是异常子类必须位于异常父类之前。

   finally():异常处理的统一出口,一定会执行的代码块,但是它是可选的,通常处理资源文件,如关闭打开的文件,删除临时文件,关闭数据库的连接。

5.throws关键字(方法上)

  在定义一个方法的时候使用,表示该方法产生的异常不进行处理,交给该方法调用处进行处理 

  public void method throws e1,e2{};

6.throw关键字(方法内)

  在方法内中抛出一个异常(throw new Exception();),如果该异常是受检异常则必须进行如下处理,如果是非受检异常则没事

  处理这个抛出来的(受检)异常,可以选择try-catch它,或者用throws将它抛出方法之外。

7.自定义异常使用

public class ExceptionTest {
 
     public static void main (String args[]) throws MyException   
     { 
          int y;
          int x=y=0;
          int z=x/y;
          if (y==0)
             throw new MyException("分母为0");
     }
  }
class MyException extends Exception
 {
   
      public MyException ()
      {
         super();
      }
      public MyException(String msg) 
      {
         super(msg);
      }
 }

小结:

     异常抛出的原则:

      1,仅有一个与异常对应catch模块执行,剩下的catch模块不会执行。且

           Java只对第一个发现的异常进行catch,不再继续执行下去,即后面

           可能出现异常的代码不再执行,并catch它。

      2,具有父类的catch模块要放到最后面,否则无法编译过去。

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

    finally{}代码块:

    只要catch或前面的语句使用了return语句,则finally区域还是会执行,除非在这之间执行了System.exit(0),则finally区域不会执行

    throw和throws区别:

    throw用在方法内部:throw new Exception (); throws用在方法定义上:public void method throws Exception

    注意:如果throw出的异常是非受检异常(RuntimeException子类),则无需对这异常进行捕获/抛出,除非是受检异常。