黑马程序员技术交流社区

标题: 【石家庄校区】异常处理 [打印本页]

作者: wlxHeiMa追梦    时间: 2018-8-1 11:14
标题: 【石家庄校区】异常处理
本帖最后由 wlxHeiMa追梦 于 2018-8-1 11:16 编辑

异常处理
1.    API(异常家族,体系结构),常用的
       Throwable 根类------>Exception类 && Error类-------->RuntimeException(Exception的子类)
       Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型.
       Throwable 类子类包括Exception子类和Error子类.
       Error类是发生的严重错误,系统(JVM)不能处理,只能修改源代码的异常类,工程师一般不能解决.例如:内存溢出,系统崩溃等系统性错误.
       Exception类是程序工程师可以解决的异常,也是可以避免的,我们可以直接抛出(交给JVM处理)或捕获(自己处理),出现异常,将异常名复制到API中查询.
2.异常的处理
       Java异常处理的五个关键字:try、catch、finally、throw、throws
1)   抛出异常throw
      在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象. throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。案例代码如下:
[Java] 纯文本查看 复制代码
public class ThrowDemo {
    public static void main(String[] args) {
        //创建一个数组
        int[] arr = {2,4,52,2};
        //根据索引找对应的元素
        int index = 4;
        int element = getElement(arr, index);
        System.out.println(element);
        System.out.println("over");
    }
    /*
     * 根据 索引找到数组中对应的元素
     */
    public static int getElement(int[] arr,int index){
       //判断  索引是否越界
        if(index<0 || index>arr.length‐1){
             /*
             判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
             这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
              */
             throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~");
        }
        int element = arr[index];
        return element;
    }
}

2)   声明异常throws
       声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。
      关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。案例代码如下:
[Java] 纯文本查看 复制代码
public class ThrowsDemo2 {
    public static void main(String[] args) throws IOException {
        read("a.txt");
    }
    public static void read(String path)throws FileNotFoundException, IOException {
        if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
            // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

3)   捕获异常try…catch
       如果异常出现的话,会立刻终止程序,所以我们得处理异常:
            1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
            2. 在方法中使用try-catch的语句块来处理异常。
       try-catch的方式就是捕获异常。
       捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
案例代码如下:
[Java] 纯文本查看 复制代码
public class TryCatchDemo {
    public static void main(String[] args) {
        try {// 当产生异常时,必须有处理方式。要么捕获,要么声明。
            read("b.txt");
        } catch (FileNotFoundException e) {// 括号中需要定义什么呢?
           //try中抛出的是什么异常,在括号中就定义什么异常类型  
            System.out.println(e);
        }
        System.out.println("over");
    }
    /*
     *
     * 我们 当前的这个方法中 有异常  有编译期异常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
            // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

4)   finally代码块
       finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行
不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
案例代码如下:
[Java] 纯文本查看 复制代码
public class TryCatchDemo4 {
    public static void main(String[] args) {
        try {
            read("a.txt");
        } catch (FileNotFoundException e) {
            //抓取到的是编译期异常  抛出去的是运行期
            throw new RuntimeException(e);
        } finally {
            System.out.println("不管程序怎样,这里都将会被执行。");
        }
        System.out.println("over");
    }
    /*
     *
     * 我们 当前的这个方法中 有异常  有编译期异常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
            // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

以上内容仅供学习交流,有问题大家可以指正.








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2