欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java高级系列——异常(Exception)

程序员文章站 2022-05-31 11:54:08
...

在解释Java中的异常时,首先我们来看一张图


Java高级系列——异常(Exception)

上图是我们Java中,异常类的一个继承关系图,从图中我们可以看到Java标准库内构建的这些通用的异常,他们都是以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

总体上我们根据Javac对异常的处理要求,将异常类分为两类,一类是checked exception,一类是unckecked exception。

unckecked exception

Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

我们来看一个具体实例

public class UncheckExceptionDemo {
    public static void main(String[] args) {
        A object = new A("Ron");
        object = null;
        System.out.println(object.getName());
    }

    public static class A{
        private String name;

        public A(String name){
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
}

执行上面的的代码,系统就会抛出一个java.lang.NullPointerException异常,这属于unckecked异常,因为我们程序在编写,编译的过程中,javac都不会强制要求我们做任何处理,同时这种异常只有在程序的运行时过程中才会发现并抛出,所以NullPointerException属于运行时异常(RuntimeException )。

checked exception

除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

我们来看一个具体实例

public class CheckedExceptionDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("D://hello.txt");
        if(!file.exists()) {
            file.createNewFile();
        }
        PrintWriter writer = new PrintWriter(file);
        writer.write("您好");
        writer.close();
    }
}

看上面的代码,当我们在对文件进行处理时,比如我们声明File,并判断指定路径下文件是否存在,不存在则创建文件时,编译器就会要求我们在方法中,要么抛出IOException异常,要么使用try…catch…finally语句捕捉异常信息。