• [java进阶]——异常详解,try catch捕获异常,抛出异常


    🌈键盘敲烂,年薪30万🌈

    目录

    一、异常的体系结构

    二、处理异常的本质

    三、异常处理的三种方式

    3.1虚拟机jvm处理(默认)

    3.2 try catch捕获异常

    3.3抛出异常

     3.4finally关键字

    四、自定义异常

    五、总结


    一、异常的体系结构

     分析:

    Error:表示JVM无法恢复的严重错误的Throwable子类。这些错误通常是由于系统资源不足、类文件损坏或其他无法控制的情况下发生的。例如,OutOfMemoryError表示JVM无法分配所需的内存量;StackOverflowError表示JVM在执行无限递归时耗尽了堆栈空间。

    Exception:Throwable的另一个子类,表示程序可能能够处理的异常情况。按类分为编译异常和运行异常

    Error我们无法处理

    Exception异常处理方式有三种:1.默认交给虚拟机处理 2.捕获异常 3.抛出异常

    二、处理异常的本质

    一句话:提高健壮性与可靠性

    你想,如果你想录入一个年龄,你要进行合法值判断,否则你就可能出现活了18.4年,-10年这样的情况,而编译器会认为这个年龄是正确的,继续运行后面的程序会发生意想不到的后果,只不过这些异常是其他形式的异常,例如数组越界,空指针,文件不存在等等。

    运行异常:运行异常通常是由程序员自身编写代码不规范引起的,比如数组越界、空指针。这些异常通常我们不会捕获,因为这些异常时可以通过提升你的代码质量来消除的。

    编译异常:编译时发生的异常,通常是程序员的错误,或者外部环境错误,例如变量没定义就使用,没有找到你要引用的库文件等等,这些异常通常使用try catch捕获或抛出。

    三、异常处理的三种方式

    3.1虚拟机jvm处理(默认)

    将异常信息打印到控制台,并直接终止程序。

    3.2 try catch捕获异常

    原理分析

    try代码块里发生异常会自动创建一个异常对象,不会执行try代码块中异常后面的代码,直接到catch里面寻找,如果catch捕获了该异常,就执行catch里面的代码,再执行try-catch后续代码,如果没有捕获,交给虚拟机处理(第一种方式)。

    注意:异常可以被继承,所以捕获父类异常一定要写到最后

    try-catch的灵魂四问:

    一问:如果try中没有遇到问题,会怎么执行

    二问:如果try中遇到多个问题,怎么执行

    三问:如果try中遇到问题没有被捕获,怎么执行

    四问:如果try中遇到了问题,那么try后的代码还会执行吗

    上才艺:

    try中没有遇到问题,会执行try-catch后面的代码

    try遇到多个问题,会处理第一个异常(找catch),并且try后面的代码不会执行,如果没有捕获交给虚拟机处理

    应用场景:

    1. try{
    2. System.out.println(arr[4]);//数组越界
    3. //System.out.println("aaaaaaa");
    4. int a = 10/0;//算数异常
    5. }catch (IndexOutOfBoundsException e){
    6. System.out.println("索引越界异常");
    7. }catch (ArithmeticException e){
    8. System.out.println("除数不能为0");
    9. }catch (NullPointerException e){
    10. System.out.println("空指针异常");
    11. }catch (Exception e){
    12. //异常的父类 一定要放到最后,
    13. //如果放到了前面
    14. //什么异常都会被捕获
    15. System.out.println("发生异常~~");
    16. }
    17. System.out.println("看看我执行了嘛~~");

    3.3抛出异常

    throw:写在方法内,结束方法,后续代码不会执行,告诉调用者是什么异常

    throws:写在方法定义处,表示声明一个异常,告诉调用者,该方法可能出现哪些异常

    编译异常必须要写,运行异常可以不写

    1. private static int getSum(int[] arr) throws NullPointerException {
    2. //可能为null指针吧
    3. if(null == arr){
    4. //抛出异常 结束方法 不会执行下面的语句
    5. throw new NullPointerException();
    6. }
    7. System.out.println("看看我执行了嘛~~");
    8. //正常计算求和
    9. int total = 0;
    10. for (int i = 0; i < arr.length; i++) {
    11. total += arr[i];
    12. }
    13. return total;
    14. }

     抛出问题的三种方法:

    1.getmessage,返回throwable字符串

    2.throw e 抛出异常

    3.e.printStackTrace()将错误以红色字体打印在控制台 最常用

    1. int[] arr = {1,2,3};
    2. try {
    3. arr[6] = 10;
    4. } catch (ArrayIndexOutOfBoundsException e) {
    5. // //getmessage方法 返回 throwable 消息字符串
    6. // String message = e.getMessage();
    7. // System.out.println(message);
    8. // tostring返回问题的简短描述
    9. // System.out.println(e.toString());
    10. //将错误以红色字体打印在控制台 最常用的
    11. // 并且继续执行下面的语句
    12. // 包含信息最多
    13. // 什么异常 异常的信息 异常的位置
    14. // e.printStackTrace();
    15. //扔给方法的调用处
    16. throw e;
    17. }

     3.4finally关键字

    finally修饰的代码块总会被执行

    1. try{
    2. …………
    3. }catch(){}……
    4. finally{
    5. //总会被执行
    6. }

    四、自定义异常

    我们可以自己定义异常以便更好的调试程序

    如何书写:

    ①写继承关系②空参和带参构造

    应用场景:

    当我们在键盘录入姓名年龄时,以前我们会打印一个提示信息,这还不够明确,现在我们直接抛出异常,这个异常信息我们就可以自定义。

    1. public void setAge(int age) {
    2. if(age > 40 || age < 18){
    3. throw new NameFormatException(age + "年龄格式错误,应18~40");
    4. }
    5. this.age = age;
    6. }
    7. //定义异常
    8. public class AgeOutOfBoundException extends RuntimeException{
    9. //空参构造
    10. public AgeOutOfBoundException() {
    11. }
    12. //带参构造
    13. public AgeOutOfBoundException(String message) {
    14. super(message);
    15. }
    16. }

    五、总结

    try-catch的执行原理

    什么是编译异常,什么是运行异常,请举例

    有继承关系的catch语句,捕获父类异常一定放到最后

    finally关键字的作用

    throw与throws的区别

  • 相关阅读:
    C++数据类型总结,看这一篇就够了
    以太网的层次结构
    数据集 | 基于计算机视觉的医学影像处理数据集
    Kubernetes(k8s)使用ingress发布服务
    Java网络编程1
    深度理解事件流和DOM事件流的工作原理
    【LeetCode-中等题】199. 二叉树的右视图
    二本4年Java经验,五面阿里艰苦经历(定薪45K),回馈一波心得体会
    打造高效的分布式爬虫系统:利用Scrapy框架实现
    Docker的网络模式
  • 原文地址:https://blog.csdn.net/Panci_/article/details/133960838