day_19——异常

异常机制

  异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。

  Java语言使用异常处理机制为程序提供了异常处理的能力

异常分类(Throwable:异常的基类)

  1.错误(error):JVM系统内部错误或资源耗尽等严重情况 -- 属于JVM需要负担的责任这一类异常事件无法恢复或不可能捕获,将导致应用程序中断。

  2.异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题。这类异常得到恰当的处理时,程序有机会恢复至正常运行状况。

Exception分类:

(数组越界、空指针、类型转换错误)

1、非受检(unchecked)异常(运行时异常 RuntimeException):编译器不要求强制处置的异常。一般是指编程时的逻辑错误。是程序员应该积极避免其出现的异常java.lang.RuntimeException及它的子类都是非受检异常:

  占内存溢出:递归、创建对象、static修饰属性、final修饰属性

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

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

  空指针访问:java.lang.NullPointerException

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

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

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

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

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

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

异常处理机制

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

  2、当JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。

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

1、捕获异常(try ... catch ... ): 

  try{
    ...代码块1...
  }catch(异常类型 e){
    ...代码块2...
  }finally{
    ...代码块3...
  }
  理解:
    代码块1:存放可能要发生的异常代码
    发生异常:生成异常对象,提交到JVM
    catch-捕获异常类型
    运行代码块2---> 处理异常的代码
    执行代码块3--->finally里的代码不管发没发生异常,都会被执行
    ps:从语法结构的角度去看待,有没有finally代码块都可以

public class Test01 {
    
    @SuppressWarnings("null")
    public static void main(String[] args) {
        
        /**
         * 处理异常方式一:try..catch..
         * 语法结构:
         *         try{
         *             ...代码块1...
         *         }catch(异常类型 e){
         *             ...代码块2...
         *         }finally{
         *             ...代码块3...
         *         }
         *    理解:
         *        代码块1:存放可能要发生的异常代码
         *        发生异常:生成异常对象,提交到JVM
         *        catch-捕获异常类型
         *        运行代码块2---> 处理异常的代码
         *        执行代码块3--->finally里的代码不管发没发生异常,都会被执行
         *        ps:从语法结构的角度去看待,有没有finally代码块都可以
         */
        
        String str = null;
        try {
            boolean equals = str.equals("123");
            System.out.println("1111111");
            System.out.println("2222222");
        } catch (NullPointerException e) {
            System.out.println("出现空指针异常");
            str = new String();
        }finally{
            boolean equals = str.equals("123");
            System.out.println(equals);
        }





public class Test02 {

    public static void main(String[] args) {

        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream("上原亚衣.avi");
            fos = new FileOutputStream("copy.avi");

            byte[] b = new byte[1024];
            int len;
            while((len = fis.read(b)) != -1){
                fos.write(b,0,len);
            }

        }catch(FileNotFoundException e){
            System.out.println("文件未找到异常");
        }catch (IOException e) {
            System.out.println("IO异常");
        }finally {
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                }
            }
            if(fos!=null){
                try {
                    fos.close();

                } catch (IOException e) {
                }
            }
        }
    }
}
应用

两种异常的处理方式一样,就可以这样编写:

  catch (NullPointerException | ArithmeticException e) {
  System.out.println("异常出现了");
  }

2、throws抛出异常类型,一般与下面的结合

public class Test01 {

    public static void main(String[] args) {

        /**
         * throws:抛出异常
         */
        try {
            method01();
        } catch (FileNotFoundException e) {
        }
    }

    public static void method01() throws FileNotFoundException{
        method02();
    }

    public static void method02() throws FileNotFoundException{
        method03();
    }

    //抛出异常,在哪里调用,就在那里处理异常
    public static void method03() throws FileNotFoundException{
        
        FileInputStream fis = new FileInputStream("xxx");

    }

}
应用

3、throw抛出单个具体异常对象

public class Test01 {
    
    public static void main(String[] args) {
        
        /**
         * throw:手动抛出异常
         * 和自定义异常类相关
         */
        
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        try {
            if(b == 0){
                //手动抛出异常
                throw new MyException();
            }
        } catch (MyException e) {
            System.out.println(e);
            b = 1;
        }
        System.out.println(a/b);
        
        
        
    }

}




public class MyException extends Exception{

    private static final long serialVersionUID = -8888922175971705495L;

    @Override
    public String toString() {
        return "除数不能为0";
    }
}
手动抛出异常和自定义异常类相关

 

posted @ 2018-11-08 17:53  cmlx  阅读(117)  评论(0)    收藏  举报