美文网首页
【Java核心基础知识】08 - Java异常分类及处理

【Java核心基础知识】08 - Java异常分类及处理

作者: Liuzz25 | 来源:发表于2023-11-07 09:45 被阅读0次

    多线程知识点目录

    多线程并发(1)- https://www.jianshu.com/p/8fcfcac74033
    多线程并发(2)-https://www.jianshu.com/p/a0c5095ad103
    多线程并发(3)-https://www.jianshu.com/p/c5c3bbd42c35
    多线程并发(4)-https://www.jianshu.com/p/e45807a9853e
    多线程并发(5)-https://www.jianshu.com/p/5217588d82ba
    多线程并发(6)-https://www.jianshu.com/p/d7c888a9c03c

    一、异常处理机制

    当一个方法遇到错误或无法完成任务时,它会抛出一个异常。这个异常可以是检查型异常(例如在尝试读取一个不存在的文件时),也可以是非检查型异常(例如空指针异常)。

    当一个异常被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。这个代码块可能是在当前方法外部的代码,也可能是同一个方法中的另一个try-catch块。

    另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。

    使用异常处理机制可以使程序更加健壮,能够处理并适当地响应在运行过程中可能出现的各种错误情况。良好的异常处理可以使程序更易于理解和维护,同时还可以提供更详细的错误信息,有助于调试和解决问题。

    二、异常分类

    异常分类
    Throwable是Java语言中所有错误或异常的超类。其子类为:ErrorException

    2.1 Error

    是指Java运行时系统内部错误和资源耗尽错误。应用程序不会抛出该对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。

    2.2 Exception

    异常有两个分支,一个是运行时异常RuntimeException,一个是检查异常CheckedException

    2.2.1 RuntimeException

    代表了一组在运行时可能会出现的异常情况。RuntimeException类本身是所有运行时异常的基类,其子类代表了各种具体的运行时异常情况。例如空指针访问、数组越界等。这些错误通常是由于程序员的疏忽或错误导致的,而不是由于外部环境或不可预知的情况引起的。因此,Java编译器不会强制程序员显式地处理这些异常,而是在运行时抛出异常,由程序员自行处理。当一个RuntimeException被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。如果没有找到匹配的异常处理代码块,程序会终止。因此,在编写Java代码时,程序员应该尽可能地避免出现RuntimeException,以确保程序的稳定性和健壮性。

    常见的RuntimeException及其含义:

    • NullPointerException:当一个应用程序试图在需要对象的地方使用null时抛出。例如,调用一个空对象的实例变量或方法。
    • IndexOutOfBoundsException:当索引超出范围时抛出,例如访问数组或字符串时。
    • ArithmeticException:当出现异常的算术条件时抛出,例如除以零或浮点溢出。
    • IllegalArgumentException:当向方法传递了一个不合法或不正确的参数时抛出。
    • IllegalStateException:当方法处于非法或不合适的状态时抛出,例如关闭了一个已经关闭的流。

    2.2.2 CheckedException

    一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一般包括几个方面:

    1. 试图在文件尾部读取数据
    2. 试图打开一个错误格式的 URL
    3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在

    三、异常的处理方式

    3.1 捕获异常(try-catch)

    当在try块中发生异常时,程序的控制流立即转移到相应的catch块。

    try {  
        //可能会抛出异常的代码  
        int[] arr = new int[5];  
        arr[10] = 50; //会抛出ArrayIndexOutOfBoundsException  
    } catch (ArrayIndexOutOfBoundsException e) {  
        //处理异常  
        System.out.println("数组越界");  
    } finally {  
        //无论是否发生异常,这里的代码都会执行  
        System.out.println("程序结束");  
    }
    

    3.2 抛出异常(throw)

    在Java中,可以使用throw关键字抛出一个异常。这必须在一个方法中完成,并且该方法必须使用throws关键字声明它可能抛出的异常。

    public void printOwing(double amount) throws Exception {  
        if (amount > 1000) {  
            throw new Exception("OWING too much");  
        } else {  
            System.out.println("amount: " + amount);  
        }  
    }
    

    3.3 声明异常(throws)

    当一个方法可能会抛出一个受检查的异常时,可以使用throws关键字声明该异常。这告诉编译器该方法可能会抛出异常,调用该方法的代码需要进行适当的异常处理。

    public void printOwing(double amount) throws Exception {  
        if (amount > 1000) {  
            throw new Exception("OWING too much");  
        } else {  
            System.out.println("amount: " + amount);  
        }  
    }
    

    3.4 throwthrows的区别

    位置不同

    1. throws 用在函数上,后面跟的是异常类,可以跟多个;而throw 用在函数内,后面跟的是异常对象。

    功能不同

    1. throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
    2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
    3. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

    相关文章

      网友评论

          本文标题:【Java核心基础知识】08 - Java异常分类及处理

          本文链接:https://www.haomeiwen.com/subject/mvtxwdtx.html