← 返回首页
JavaSE系列教程(五十七)
发表时间:2020-02-04 15:50:53
介绍java的异常和异常的分类。

Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。

Java的异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。

1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。

2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。

3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。

1.异常的结构

Java的异常是class,它的继承关系如下:

从继承关系可知:Throwable是异常体系的根,它继承自Object。Throwable有两个体系:Error和Exception,Error表示严重的错误,程序对此一般无能为力,例如:

OutOfMemoryError:内存耗尽 VirtualMachineError:虚拟机错误 StackOverflowError:栈溢出 ThreadDeath:线程死锁

而Exception则是运行时的错误,它可以被捕获并处理。

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:

NumberFormatException:数值类型的格式错误 FileNotFoundException:未找到文件 SocketException:读取网络失败 还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:

NullPointerException:对某个null的对象调用方法或字段 IndexOutOfBoundsException:数组索引越界

Exception又分为两大类:

1)RuntimeException以及它的子类;称为不受检异常。

2)非RuntimeException(包括IOException、ReflectiveOperationException等等);称为受检异常。

==java语法规定:受检异常是必须进行处理的异常,如果不处理,程序就不能编译通过。而不受检查异常程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。==

常见的不受检查性异常有:

例如:

    public static void main(String[] args) throws Exception {

        int[] arr = {1,2,3,4,5};
        for(int i=0;i<=arr.length;i++){ 
            System.out.println(arr[i]);
        }

    }

程序运行时抛出不受检查异常:
1
2
3
4
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at encapsulationdemo.Demo1.main(Demo1.java:36)

不受检查异常通常由程序逻辑错误引起,仔细观察我们发现是由于循环结束条件误写i<=arr.length出现了数组下标越界异常。

常见的受检查异常有:

例如:

   public static void main(String[] args) {

        String s = "2020-abc-ef";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date d = sdf.parse(s); //这里会抛出受检查异常,必须进行异常处理,捕获异常并处理异常。
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

运行时抛出受检查异常:
java.text.ParseException: Unparseable date: "2020-abc-ef"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at encapsulationdemo.Demo1.main(Demo1.java:39)

小结:

1)Java的异常类都是从Throwable继承;

2)Error是无需捕获的严重错误,Exception是应该捕获的可处理的错误;

3)RuntimeException无需强制捕获,称为不受检查性异常,非RuntimeException(Checked Exception)称为受检查性异常,必须进行处理的异常,如果不处理,程序就不能编译通过。