文章目录

Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception 。

Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Exception :表示可恢复的例外,这是可捕捉到的。

Java 提供了两类主要的异常 :runtime exception 和 checked exception 。 checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。

但是另外一种异常: runtime exception ,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run()抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常 ,或者是通过对异常的处理显式的控制程序退出。

    异常处理的目标之一就是为了把程序从异常中恢复出来 。

1. 开场白

    对于程序运行过程中的可能出现异常情况,java语言使用一种称为异常处理的错误捕捉机制进行处理。相信大家对 try { }catch( ){} finally{} 这种结构非常熟悉,使用频率极高。既然经常使用它,而且也是面试常问知识点,我们就有必要去深入地了解一下。也谈不上深入,只是java语言的基本功。下面,开始吧!

2. 概览理解

首先明白下面的两个概念 
unchecked exception(非检查异常):包括运行时异常(RuntimeException)和派生于Error类的异常。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。 
checked exception(检查异常,编译异常,必须要处理的异常) 
也:称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeptionSQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。

3. 异常分类

在java中,异常对象都是派生于Throwable类的一个实例。如果java内置的异常类不能够满足需求,用户还可以创建自己的异常类。

      下图是java异常类层次结构图:


https://cdn.xwder.com/image/blog/xwder/1-20201013092150852.png

可以看出,所有的异常都是由Throwable类,下一层分解为两个分支:Error和Exceprion。Error层次结构描述了java运行时系统的内部错误和资源耗尽错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。应用程序不应该抛出这种类型的对象。Exceprion这个层次结构又分解为连个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。 
    常见的RuntimeException(运行时异常): 
    IndexOutOfBoundsException(下标越界异常
    NullPointerException(空指针异常
    NumberFormatException String转换为指定的数字类型异常) 
    ArithmeticException -(算术运算异常 如除数为0 
    ArrayStoreException - (向数组中存放与声明类型不兼容对象异常) 
    SecurityException -(安全异常) 
    IOException(其他异常) 
    FileNotFoundException(文件未找到异常。) 
    IOException(操作输入流和输出流时可能出现的异常。) 
    EOFException (文件已结束异常)

4. 异常处理

    (1)、抛出异常

    1、调用一个抛出受查异常的方法必须用throws 子句声明 调用method2()方法。 
    2、程序运行过程中发现错误,并且利用throw抛出一个受查异常 下面method2()方法。

@Test
public void test() throws FileNotFoundException {

    method();
}

public void method() throws FileNotFoundException {
    //一个会抛出异常的方法
    method2();
}

//这里 方法后是throws 
public void method2() throws FileNotFoundException {
    //这里是throw 
    throw new FileNotFoundException();
}

    (2)、捕获异常

        try { }catch( ){} finally{} 语句块这就比较常见了。不在赘述。 不过下面有一道有意思的题,实际使用中不太会遇见,面试题常见。

        来,看题!

        ①:

@Test
public void test() {

    System.out.println(test11());
}

public String test11() {
    try {
        System.out.println("try block");

        return test12();
    } finally {
        System.out.println("finally block");
    }
}

public static String test12() {
    System.out.println("return statement");

    return "after return";
}

   答案: 
            try block 
            return statement 
            finally block 
            after return

        ②

public int test2() {
    int b = 20;

    try {
        System.out.println("try block");

        return b += 80;
    } catch (Exception e) {

        System.out.println("catch block");
    } finally {

        System.out.println("finally block");

        if (b > 25) {
            System.out.println("b>25, b = " + b);
        }

        return 200;
    }
}

   答案: 
            try block 
            finally block 
            b>25, b = 100 
            200

    总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

转载自:java异常处理 Exception、error、运行时异常和一般异常有何异同


xwder : 2020年10月27日 09点34分
2020-10-27 09:36:08.0
xwder : 000000000000000000
2020-10-24 16:48:33.0
null : 回复@xwder : @丢你雷某!😂🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣
2020-10-24 00:09:48
null : 😳😳😳😳😳😳😳😳😳
2020-10-24 16:39:10.0
null : 回复@null : @哭泣😂🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣
2020-10-24 00:09:48
null : 8888888888888
2020-10-24 16:37:47.0
null : 999999999999
2020-10-24 16:36:07.0
null : 66666666666
2020-10-24 16:33:27.0
null : 回复@null : @66666个锤子!!🔨🔨🔨🔨🔨
2020-10-24 00:09:48
xwder : 丢泥丢你雷姆!!!
2020-10-24 16:08:23.0
null : 可以看出,所有的异常都是由Throwable类,下一层分解为两个分支:Error和Exceprion。Error层次结构描述了java运行时系统的内部错误和资源耗尽错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。应用程序不应该抛
2020-10-24 14:35:59.0
null : 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇
2020-10-24 00:38:36.0
null : 回复@xwder : @Exception、Error、运行时异常与一般异常有何异同Exception、Error、运行时异常与一般异常有何异同
2020-10-24 00:09:48
null : 回复@xwder : @回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论回复i评论
2020-10-24 00:09:48
xwder : 回复@null : @但是另外一种异常: runtime exception ,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
2020-10-24 00:09:48
xwder : finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
2020-10-24 00:22:05.0
null : 回复@null : @你特么说啥哩!!!!!!
2020-10-24 00:09:48
null : 回复@xwder : @表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
2020-10-24 00:09:48