java异常处理

 笔上得来终觉浅,绝知此事要躬行

🔥 个人主页:星云爱编程

🔥 所属专栏:javase

🌷追光的人,终会万丈光芒  

 🎉欢迎大家点赞👍评论📝收藏⭐文章

  

一、异常

1.1基本介绍

java中,将程序执行中发生的不正常情况称为异常。

开发过程中的语法错误和逻辑错误不是异常。

执行过程中发生的异常事件可分为两大类:

(1)Error(错误):java虚拟机无法解决的严重问题。

例如:jvm系统内部错误,资源耗尽等严重情况

(2)Exception(异常):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。

例如:空指针访问,试图读取不存在的文件,网络连接中断等。

  注:

①异常分为两大类,运行时异常和编译时异常

②运行时异常,编译器检查不出来。一般指的是编程时的逻辑错误,是程序员应该避免其出现的异常。

③对于运行时异常,可以不做处理。

④编译时异常,编译器要求必须处置的异常。

1.2常见的运行时异常

(1)NullPointerException 空指针异常

(2)ArithmeticException 数学运算异常

(3) ArrayIndexOutOfBoundsException 数组下标越界异常

(4)ClassCastException 类型转换异常

(5)NumberFormatException 数字格式不正确异常[]

1.3编译异常

1.3.1介绍

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

1.3.2常见的编译型异常

(1)SQLException:操作数据库时,查询表可能发异常

(2)IOException:操作文件时,发生的异常

(3)FileNotFoundException:当操作一个不存在的文件时,发生异常

(4)ClassNotFoundException:加载类,而该类不存在时发生异常

(5)EOFException:操作文件到文件末尾,发生异常

(6)IllegalArguementException:参数异常

二、异常处理

2.1基本介绍

异常处理就是当异常发生时,对异常的处理方式。

2.2异常处理方式

(1)try - catch -finally

程序员在代码中捕获发生的异常,自行处理。

(2)throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。

2.3异常处理机制

(1)try - catch -finally:

try{
            //可能有异常的代码
        }catch (Exception e){
            //捕获到异常
            //(1)当异常发生时
            //系统将异常信息封装成Exception对象e,传递给catch
            //得到异常后,程序员自己处理。
            //(2)若没有发生异常,catch代码块不执行
        }finally {
            //(1)不管try代码块有无异常发生,finally代码块都会执行
            //(2)通常将释放资源的代码,放在finally
        }

(2)throws:

2.4 try - catch 异常处理

2.4.1基本介绍

java提供try和catch块来处理异常。

try块用于包含可能会出现异常的代码,catch块用于处理try块中发现的异常。

2.4.2基本语法

try{
    //可能有异常的代码
    //将异常生成对应的异常对象,并传递给catch块
}catch (Exception e){
    //对异常的处理
}

注:没有finally,语法也可以通过

2.4.3案例

 被除数为0:

public class Test2 {
    public static void main(String[] args) {
        int a=10;
        int b=0;
        
        try{
            int c=a/b;
        }catch (ArithmeticException e){
            System.out.println(e.getMessage());
        }
    }
}

2.4.4注意事项

(1)如果异常发生了,则发生异常的代码后面不会执行,而是直接进入到catch块。

eg:

public class Test2 {
    public static void main(String[] args) {
        int a=10;
        int b=0;

        try{
            System.out.println("异常发生前");
            int c=a/b;
            System.out.println("异常发生后");
        }catch (ArithmeticException e){
            System.out.println(e.getMessage());
        }
    }
}

 (2)如果异常没有发生,则正常执行try代码块中的代码,不会进入到catch代码块中。

(3)如果有不管异常发布发生都要执行的代码(如,关闭连接,释放资源等),则使用try-catch-finally,并将其放到finally代码块中。

(4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理)要求父类异常在后,子类异常在前。如果发生异常,只会匹配一个catch。

eg:

public class Test2 {
    public static void main(String[] args) {
        int a=10;
        int b=0;

        try{
            int c=a/b;
        }catch (ArithmeticException e){
            System.out.println(e.getMessage()+"子类异常");
        }catch (Exception e){
            System.out.println(e.getMessage()+"父类异常");
        }
    }
}

(5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接退出。

应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

2.4.5try - catch -finally执行顺序结论

(1)如果没有出现异常,则执行try块中的所有语句,不执行catch块中的语句,如果有finally,最后还需执行finally块中的语句。

(2)如果出现异常,则try块中异常发生后,try快剩下的语句不再执行,而是执行catch块中的语句,如果有finally,最后还需要执行finally里的语句。

2.5throws异常处理

2.5.1基本介绍

(1)如果一个方法(方法中的语句执行时)可能生成某种异常,但是并不能确定如何处理该异常,则此方法应显式地声明抛出异常,表示该方法将不对这些异常进行处理,而由该方法的调用者处理。

(2)在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

2.5.2注意事项

(1)对于编译异常,程序中必须处理。例如:t-c-f 或throws

(2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理。

(3)方法重写父类的方法时,对抛出异常的规定:子类的重写方法,所抛出的异常类型要么和父类抛出的类型一致,要么为父类抛出的异常类型的子类型。

(4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws。

三、自定义异常

3.1基本介绍

当程序中出现了某些“错误”,当该错误信息并没有在Throwable子类中描述处理,这个时候就可以自己设计异常类,用于描述该错误信息。

3.2自定义异常的步骤

(1)定义类:class 自定义异常名 继承Exception或RuntimeException。

例如:

class NameNull extends Exception{ }

(2)如果继承Exception属于编译异常。

(3)如果继承RuntimeException,属于运行异常。

注:一般情况下,我们自定义异常是继承RuntimeException,即把自定义异常做成运行时异常;这样做的好处是我们可以使用默认的处理机制。

3.3throw和throws的区别

意义位置后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象

结语

感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!

路漫漫其修远兮,吾将上下而求索。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值