java异常处理-2

简介: java异常处理

java异常处理-1

https://developer.aliyun.com/article/1515774


三、常见异常

       java内部提供了一些异常,用来描述经常发生的错误,其中,有的需要程序员极性捕捉处理或声明抛出。有的是由java虚拟机自动进行捕捉

       java常见的异常类如表:

java常见的异常类

异常类 说明
ClassCastException 类型转换异常
ClassNotFoundException 未找到相应的类异常
ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组下标越界异常
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NullPointerException 空指针异常
NoSuchFieldException 未找到字段异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转化为数字抛出的类异常
NegativeArraySizeException 数组元素个数为负数抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IOException 输入输出异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常

        以上异常的出现场景希望读者可以自行研究。


四、自定义异常

       使用java内置的异常类可以处理在编程期间出现的大多数异常情况,但是仍有部分比较有特性的异常是java内置异常没有覆盖到的。例如:对于需要传入整数的一个方法,你可能会觉得,传入 一个负数是不符合你的期望,认为负数作为这个方法的参数为一个错误的值,但是对于java来说,它不会将其视为一个错误或者异常。

       所以为了能个性化地去解决这些在特殊情况才能出现的异常,java引入了自定义异常类,用户只需要继承Exception类即可以自定义异常类。

       那么具体如何自定义异常类呢?


首先,在java中异常都是作为类的实例的形式出现的,所以我们应该先定义自定义的类,类名设为MyException(自定义类名视使用场景况而定),然后由该类继承Exception类:

       代码案例:

public class MyException extends Exception{    // 声明这个MyException类并让其继承Exception类
    public MyException (String ErrorMessage){    // 调用构造方法
        super(ErrorMessage);   // 给父类Exception传参
    }
}


       字符串ErrorMessage是要输出的错误信息。

 使用throw关键字,在需要的时候抛出异常,就比如我们经常使用ArrayList表里面的set方法:

bf0dd34cd4fda5788167ce25d3bcb362_ae70baf961134e05bd67db13558ee6a6.png

里面就是使用了rangeCheck()方法来检查index是否越界,点击查看rangeCheck方法可以看到如下:


在这里通过使用throw 关键字抛出对应的异常信息,里面的outOfBoundMsg(index)返回一个错误 的异常信息的字符串,对应我们自定义异常的  ErrorMessage  :

2ee6da85fd667bd60c9a285e9527144f_15cee0ff5b91479e821f2c48fbbf4f8d.png


        然后使用构造方法构造new 出一个IndexOutOfBoundsException 的实例并抛出异常。


       我们使用自定义异常配合try- catch语句来模拟这个过程:

 

 
 
public class Main {
    private static void checkMySet(int pos,int len) throws MyException{
        if(pos >= len){
            throw new MyException("指定的下标超过已有的最大下标位置");
        } else if (pos < 0 ) {
            throw new MyException("指定下标小于0!");
        }else {
            System.out.println("下标数值正确!");
        }
    }
    public static void set(int[] arr,int pos,int element) throws MyException {
        checkMySet(pos,arr.length);
        arr[pos] = element;
    }
    public static void main(String[] args) {
        int[] arr = new int[10];
        try {
            set(arr,-4,10);   // 可能抛出异常
        } catch (MyException e) { 
            System.out.println(e);  // 进行捕捉
        }
    }
}

结果为:

程序正常退出。

       throw关键字

       throw关键字通常用于方法体重,并且抛出一个异常的实例化对象,对象被抛出后程序终止:


可以看到,如果在方法体内抛出对象的语句后面加上语句,那么后面的语句将永远不会执行到

代码案例如下:

public class Main {
    private static void Test(int pos) throws MyException{
        if(pos >= 0){
            throw new MyException("pos >= 0");
        }
        System.out.println("checkEnded");
    }
    public static void main(String[] args) {
        int[] arr = new int[10];
        try {
            System.out.println("TestStart");
            Test(0);
            System.out.println("TestEnd");
        } catch (MyException e) {
            System.out.println(e);  // 进行捕捉
        }
    }
}


执行结果:

可以看出来,在方法抛出异常后,该方法后面的语句也不会执行

如果要捕捉异常,就必须使用try - catch语句


       此外,throw必须写在方法体内部 ,抛出的对象必须是Exception 或者 Exception 的子类对象。如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理  如果抛出的是编译时异常,用户必须处理,否则无法通过编译 。异常一旦抛出,其后的代码就不会执行


       throws关键字

       throws关键字通常被用来在声明方法的时候,指定其方法可能抛出的异常,多个异常可以用“,”逗号分割:


public static void Test ()  throws Exception1 , Exception2 , Exception3 {

       //可能会抛出Exception1 , Exception2 , Exception3异常的方法体

}


       从上面的代码案例中我们可以看到:checkMySet()方法中加入了if 语句来来判断是否抛出异常,有可能会抛出,也可能不会抛出,只要有抛出的可能,就需要在其方法后用throws关键字声明可能会抛出的异常类。


       处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助throws 将异常抛 给方法的调用者来处理。

       异常被throws 不断向上抛出,最终被catch 捕获并处理。


需要注意的是:


① throws必须跟在方法的参数列表之后

② 声明的异常必须是 Exception 或者 Exception 的子类


五、运行时异常

      RuntimeException 异常是程序运行过程中产生的异常。它是Exception类的子类之一。


        java类库的每个包中都定义了异常类,所有的类都是Throwable的子类,Throwable派生出两个子类,分别是Exception 和 Error 类。 Error 类及其子类用来描述java运行系统中的内部错误以及资源消耗的错误。


       Exception类异常通过捕捉后程序可以继续正常执行。

62e97eb0432d7ca9738c33f541762acf_30b1cc90e5c644a689334aeb75f19eb6.png

 

其中RuntimeException的异常种类


        从图中可以看出来,Throwable 是异常处理体系的顶层类,派生除了Error 和 Exception 两个重要的子类。Error 指的是java虚拟机无法解决的严重问题,例如jvm内部错误,资源耗尽等等,其代表为: StackOverflowError  和 OutOfMemoryError。

     Exception 异常类为程序员可以正常捕捉并处理的异常。

RuntimeException异常

NullPointerException 空指针异常
ArrayIndeOutOfBoundsException 数组下标越界异常
ArithmeticException 算术异常
SecurityException 安全性异常
NegativeArrayException 数组长度为负异常
IllegalArgumentException 非法参数异常
ArrayStoreException 数组中包含不兼容参数异常

六、异常处理流程


       程序先执行 try 中的代码 如果 try 中的代码出现异常 , 就会结束 try 中的代码 , 看和 catch 中的异常类型是否匹配 . 如果找到匹配的异常类型, 就会执行 catch 中的代码 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者 . 无论是否找到匹配的异常类型, fifinally 中的代码都会被执行到 ( 在该方法结束之前执行 ). 如果上层调用者也没有处理的了异常, 就继续向上传递 . 一直到 main 方法也没有合适的代码处理异常 , 就会交给 JVM 来进行处理 , 此时程序就会异常终止。

     

       java异常强制用户去考虑程序的强健性和安全性。当程序运行到某个方法可能会出现异常时,可以在当前方法中使用try - catch 语句捕获异常。

       如果一个方法被覆盖的时候,则需要在他的上级方法中声明抛出相同异常或异常的子类。如果父类中抛出多个异常,则覆盖方法必须抛出那些异常的的一个子集,不能抛出新的异常。

目录
相关文章
|
1天前
|
Java
Java 异常处理下篇:11 个异常处理最佳实践
本文深入探讨了 Java 异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理的异常、不要忽略捕获的异常、抛出具体检查性异常、正确包装自定义异常、记录或抛出异常但不同时执行、避免在 `finally` 块中抛出异常、避免使用异常进行流程控制、使用模板方法处理重复的 `try-catch`、尽量只抛出与方法相关的异常以及异常处理后清理资源。通过遵循这些实践,可以提高代码的健壮性和可维护性。
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
8 2
|
3天前
|
Java 程序员 数据库连接
深入浅出Java异常处理
【10月更文挑战第30天】在Java的世界里,异常处理就像是生活中的急救箱,遇到意外时能及时救治。本文不仅教你如何使用try-catch语句包扎“伤口”,还会深入讲解如何通过自定义异常来应对那些常见的“头疼脑热”。准备好,我们将一起探索Java异常处理的奥秘,让你的程序更加健壮。
|
4天前
|
Java 程序员 数据库连接
Java中的异常处理:理解与实践
【10月更文挑战第29天】在Java编程的世界里,异常像是不请自来的客人,它们可能在任何时候闯入我们的程序宴会。了解如何妥善处理这些意外访客,不仅能够保持我们程序的优雅和稳健,还能确保它不会因为一个小小的失误而全盘崩溃。本文将通过浅显易懂的方式,带领读者深入异常处理的核心概念,并通过实际示例展现如何在Java代码中实现有效的异常管理策略。
|
7天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
20 2
|
8天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
16 2
|
9天前
|
Java 程序员 开发者
Java编程中的异常处理艺术
【10月更文挑战第24天】在Java的世界里,代码就像一场精心编排的舞蹈,每一个动作都要精准无误。但就像最完美的舞者也可能踩错一个步伐一样,我们的程序偶尔也会遇到意外——这就是所谓的异常。本文将带你走进Java的异常处理机制,从基本的try-catch语句到高级的异常链追踪,让你学会如何优雅地处理这些不请自来的“客人”。
|
10天前
|
Java 数据库连接 开发者
Java中的异常处理机制####
本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
|
8天前
|
Java 程序员 UED
Java中的异常处理:从基础到高级
【10月更文挑战第25天】在Java的世界中,异常处理是维护程序健壮性的重要手段。本文将深入浅出地介绍Java异常处理的机制,从基本的try-catch-finally结构出发,逐步探讨更复杂的异常处理策略,如自定义异常、异常链以及如何利用异常处理提高代码的可读性和可维护性。通过具体示例,我们将看到如何优雅地处理异常,确保程序在面对不可预见的错误时仍能稳定运行。
8 1
|
13天前
|
安全 Java 程序员
深入浅出Java中的异常处理机制
【10月更文挑战第20天】本文将带你一探Java的异常处理世界,通过浅显易懂的语言和生动的比喻,让你在轻松阅读中掌握Java异常处理的核心概念。我们将一起学习如何优雅地处理代码中不可预见的错误,确保程序的健壮性和稳定性。准备好了吗?让我们一起踏上这段旅程吧!
22 6