JAVA基础--异常与处理方法

在java程序设计中,异常对象都是派生于Throwable类的一个实例。

异常体系结构

java中异常层次结构

Throwable体系:

  • Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
  • Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑尾炎。

Exception体系:

  • IOException:处于编译器期的异常需要我们来处理,如日期格式化错误,找不到文件位置。
  • RuntimeException: 处于运行期的异常,JVM会自动进行处理,像数组下标出界。

异常处理方法

RuntimeException

这类异常,不需要我们亲自处理,JVM会检测到该异常处理,处理方法:检测到异常–>控制台打印异常信息–>中断程序运行。
也就说JVM会直接将错误打印在控制台,并且注意的是该错误后的后续程序不会执行
当然我们也以自己判断异常是否存在,再自己使用捕获的方式处理(这种方式后续的程序会执行)。

throw抛出异常

可以用于检测数据是否安全问题,手动去处理运行期的异常。

public static void main(String[] args) {
    
    
//      int arr[] = new int[]{1,2,3};
        int arr[] = null;
        int temp = getArr(arr,3);
        System.out.println("temp="+ temp);
    }

    public static int getArr(int[] array, int index) {
    
    

        if (array == null) {
    
    
            throw new NullPointerException("空数组");
        }
        int length = array.length;
        if (index > length-1) {
    
    
            throw new ArrayIndexOutOfBoundsException("超出数组下标");
        }
        return array[index];
    }

在这里插入图片描述

IOException

处在编译器的异常需要我们去亲自处理,否则会一直报错编译不通过,编译器会给我们提示该异常。

thorws声明异常

声明异常会将编译器的异常抛给调用该方法的调用者,调用者也得声明该异常,直至抛到main函数,再声明异常抛给JVM处理。
如果声明的多个异常中存在继承关系,可以只声明该父类异常,最简单的方式直接声明Exception。

public static void main(String[] args) throws IOException{
    
    
            readFile("c://b.tx");
    }

public static void readFile(String fileName) throws IOException{
    
    
        if(!fileName.endsWith("txt")) {
    
    
            throw new IOException("文件类型不对!");
        }

        if(!fileName.equals("c://b.txt")) {
    
    
            throw new FileNotFoundException("文件路径不对");
        }
        System.out.println("文件读取成功!");
    }

try catch捕获异常

通过这种方式处理的异常的后续程序会正常执行,try中的异常发生错误的后续程序不执行,就是try花括号包括的程序,不过后面的程序会正常执行。

public static void main(String[] args){
    
    
        // 使用try catch来处理异常

        try {
    
    
            readFile("c://b.tx");
        } catch (IOException e) {
    
    // 抛出什么异常,就定义什么异常
            // 打印异常全面信息,属于超类Throwable的方法
            e.printStackTrace();
        }
        System.out.println("后续程序");
    }

    /*
    * FileNotFoundException为编译期异常需要我们亲自处理,使用throws抛出给方法调用者直至
    * 抛到主函数,再抛给JVM处理。
    * IOException问所有编译期异常的父类,可以只抛出该类,其他的异常就被包括了。
    * */
    public static void readFile(String fileName) throws IOException{
    
    
        if(!fileName.endsWith("txt")) {
    
    
            throw new IOException("文件类型不对!");
        }

        if(!fileName.equals("c://b.txt")) {
    
    
            throw new FileNotFoundException("文件路径不对");
        }
        System.out.println("文件读取成功!");
    }

在这里插入图片描述

finally关键字
该关键字里的代码块无论是发生异常还是不发生异常都会执行,通常用于释放资源。

public static void main(String[] args){
    
    
        // 使用try catch来处理异常
        try {
    
    
            readFile("c://b.txt");
        } catch (IOException e) {
    
    // 抛出什么异常,就定义什么异常
            // 打印异常全面信息,属于超类Throwable的方法
            e.printStackTrace();
        } finally {
    
    
            // finally中的方法,无论异常出现与否都会执行
            // 注意事项:finally中避免出现return方法,否则会一直返回该值
            System.out.println("资源释放");
        }
        System.out.println("后续程序");
    }

    public static void readFile(String fileName) throws IOException {
    
    
        if(!fileName.endsWith("txt")) {
    
    
            throw new IOException("文件类型不对!");
        }

        if(!fileName.equals("c://b.txt")) {
    
    
            throw new FileNotFoundException("文件路径不对");
        }
        System.out.println("文件读取成功!");
    }

在这里插入图片描述

处理多个异常方法

处理多个异常的方法:

  • 一:一个异常一个处理,就是写多个 try catch,太麻烦不可取
  • 二:多个异常,多个处理,写一个try捕获所有异常,写多个catch来处理不同中类的异常。
    注意事项:如果两个异常存在存在继承关系,可以只写父类不写子类, 如果非要都写,那么子类catch必须写在父类上面,否则报错(原因:子类异常可以通过多态的方法赋值给父类,子类在下面就多余了。)
  • 三:多个异常一次性处理:一个try一个catch,catch中可以用Exception来处理一切异常。

子父类方法异常

父类方法抛出多个异常,子类在重写该方法时也要抛出这些异常,或者抛出这些异常的子类,或者不抛出异常。
父类的方法没有抛出异常,子类也不能抛出异常,只能通过捕获处理。
总结:父类怎么处理异常子类就怎么处理就完事了。

猜你喜欢

转载自blog.csdn.net/qq_44660367/article/details/108933417
今日推荐