Java的异常处理|Java基础

542 阅读4分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

Java中异常分类

今天介绍Java中的异常,都是概念性的东西,代码涉及较少。

  按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫CheckedException和运行时异常(也叫非强制性异常)也叫RuntimeException。只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种:

  • 当前方法知道如何处理该异常,则用try...catch块来处理该异常。

  • 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。

try...catch

public class BufferedStreamLearn {
    public static void main(String[] args)  {
        //创建字符缓冲输入流
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("File\ShixfBW.txt"));
            String line;
            while ((line=br.readLine())!=null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

方法抛出

public class BufferedStreamLearn {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("File\ShixfBW.txt"));

        String line;
        while ((line=br.readLine())!=null) {
            System.out.println(line);
        }

        br.close();
    }
}

  运行时异常只有当代码在运行时才发行的异常,编译时不需要try catch。Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。

finally介绍

public class Client {
    public static void main(String[] args) {
        try {
            int i = 1 / 0;
        } catch (Exception e){
            System.out.println("0不能做除数");
            e.printStackTrace();
        } finally {
            System.out.println("finally 块执行");
        }
    }
}

image.png finally无论是否抛出异常finally总是执行,一般用于释放资源的操作

error和exception的区别

Error类和Exception类的父类都是Throwable类,他们的区别如下。

  • Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

  • Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

throw和throws的区别

throw:

  • throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  • throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

throws:

  • throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

  • throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

  • throws表示出现异常的一种可能性,并不一定会发生这种异常

final、finally、finalize的区别

  • final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

  • finally:异常处理语句结构的一部分,表示总是执行。

  • finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用.