90%程序员不知道的Java异常处理暴富法则!2025避坑代码模板免费领(附灵魂四问调试宝典)

在开始之前,让我们高喊我们的口号:

键盘敲烂,年薪百万!

我听说关注我的人都已经暴富了!


目录

键盘敲烂,年薪百万!

我听说关注我的人都已经暴富了!

异常是什么?

报错怎么看?简单来说就是看冒号

常见异常家族成员有哪些?

异常作用有哪些?

异常处理方式

1.JVM默认处理方式

2.自己处理(捕获异常):目的是代码出现异常的时候,可以让程序继续运行下去。

异常灵魂四问

3.抛出异常:

throws

throw

异常中的常见方法


异常是什么?

异常就是代表程序出现的问题。

我们学习异常不是为了防止异常出现,而是学习异常发生以后的处理措施

报错怎么看?简单来说就是看冒号

常见异常家族成员有哪些?

运行时异常(RuntimeException),在编译的时候不会异常,在运行时出现异常,例如:数组越界异常。

编译时异常:在编译阶段就会报异常,例如:日期解析异常。

 java文件——>字节码文件(.class)——>运行结果

编译时异常就是在第一阶段出现的,只会检查语法是否错误以及做一些优化

运行时异在第二阶段出现,表示代码运行时候出现的异常。一般由数据传递错误导致。


异常作用有哪些?

  1. 用于检查查找bug
  2. 通知调用者底层执行的情况

异常处理方式

1.JVM默认处理方式

异常名称、原因、位置等显示在控制台,程序停止运行,不再执行下面的代码。异常是红色字体。

2.自己处理(捕获异常):目的是代码出现异常的时候,可以让程序继续运行下去。

一般用在调用处,能让代码继续运行。

格式:

try{
可能出现异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
}
异常灵魂四问

1.灵魂一问:如果try中没有遇到问题,怎么执行?

会把try里面所有的代码全部执行完毕,不会执行catch里面的代码

2.灵魂二问:如果try中可能会出现多个问题,怎么执行?

会写多个catch与之对应,父类异常需要写在下面

3.灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?

相当于try……catch白写了,当前异常会交给虚拟机处理

4.如果try中遇到了问题,那么try下面的其他代码还会执行吗?

不会执行。try中遇到问题,直接跳转到对应的catch,如果没有对应的catch与之匹配,则交给虚拟机处理。

灵魂一问:

public class ExceptionDemo7 {
        /*
            自己处理(捕获异常)灵魂四问:
                灵魂一问:如果try中没有遇到问题,怎么执行?
                            会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
                            注意:
                                只有当出现了异常才会执行catch里面的代码
         */
        public static void main(String[] args) {
            int[] arr = {1,2,3,4,5,6};
            try {
                System.out.println(arr[0]);//这里越界了,会打印"数组下标越界",然后再打印"看我执行了没?"
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("数组下标越界");
            }
            System.out.println("看我执行了没?");//执行了
        }
}

灵魂二问:

public class ExceptionDemo8 {
    public static void main(String[] args) {
        /*
            自己处理(捕获异常)灵魂四问:
                灵魂二问:如果try中可能会遇到多个问题,怎么执行?
                        会写多个catch与之对应
                        细节:
                            如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面

                        了解性:
                            在JDK7之后,我们可以在catch中同时捕获多个异常,中间用|进行隔开
                            表示如果出现了A异常或者B异常的话,采取同一种处理方案
         */
//JDK7
        int[] arr = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[10]);
            System.out.println(2/0);
            String s = null;
            System.out.println(s.equals("abc"));
        } catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
            System.out.println("索引越界了");
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }catch (Exception e){
            System.out.println("异常");
        }
        System.out.println("看我执行了没?");//要执行。
        // 最后的结果是:
        // 索引越界了
        //看我执行了没?
    }
}

 灵魂三问:

public class ExceptionDemo9 {
    public static void main(String[] args) {
       /*
            自己处理(捕获异常)灵魂三问:
                如果try中遇到的问题没有被捕获,怎么执行?
                相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。
         */
        int[] arr = {1,2,3,4,5,6};

        try {
            System.out.println(arr[10]);
        } catch (NullPointerException e) {
            System.out.println("空指针异常");//这里不会执行的,因为错误是ArrayIndexOutOfBoundsException
            //new ArrayIndexOutOfBoundsException交给JVM虚拟机处理这个异常
        }
        System.out.println("看我执行了没?");
    }
}

灵魂四问:

public class ExceptionDemo10 {
    public static void main(String[] args) {

        /*
            自己处理(捕获异常)灵魂四问:
                如果try中遇到了问题,那么try下面的其他代码还会执行吗?
                下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体
                但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理
         */
        int[] arr = {1, 2, 3, 4, 5, 6, 7};

        try {
            System.out.println(arr[10]);
            System.out.println("看我会执行吗?");//不会
        } catch (IndexOutOfBoundsException e) {
            System.out.println("数组下标越界");
        }
    }
}

3.抛出异常:

在方法中,出现异常了。方法就没有继续运行下去的意义了,采取抛出处理。让该方法结束运行并告诉调用者出现了问题。

throws

格式:

public void 方法() throws 异常类名1,异常类名2...{
            ...
}

注意:写在方法定义处,表示声明一个异常告诉调用者,使用本方法可能会有哪些异常。

throw

格式:

public void 方法(){
throw new NullPointerException();
}

注意:写在方法内,结束方法;手动抛出异常对象,交给调用者方法中下面的代码不再执行。

编译时异常:必须写。

运行时异常:可以不写。

public class ExceptionDemo12 {
    public static void main(String[] args) {
/*
        throws:写在方法定义处,表示声明一个异常。告诉调用者,使用本方法可能会有哪些异常。
        throw :写在方法内,结束方法。手动抛出异常对象,交给调用者。方法中下面的代码不再执行了。


        需求:
            定义一个方法求数组的最大值s
*/
        int[] arr =new int[0];
        int max = 0;
        try {
            max = getMax(arr);
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组下标越界");
        }
    }

    public static int getMax(int[] arr) /*throws NullPointerException,ArrayIndexOutOfBoundsException*/{
        if (arr == null) {
            throw new NullPointerException();
        }
        if (arr.length == 0) {
            throw new ArrayIndexOutOfBoundsException();
        }
        System.out.println("看我执行了嘛?");//这里不会执行
        int max = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
}

异常中的常见方法

public class ExceptionDemo11 {
    public static void main(String[] args) {
        /*
              public String getMessage()          返回此 throwable 的详细消息字符串
              public String toString()            返回此可抛出的简短描述

              public void printStackTrace()       在底层是利用System.err.println进行输出
                                                  把异常的错误信息以红色字体输出在控制台
                                                  细节:仅仅是打印信息,不会停止程序运行
        */


        int[] arr = {1, 2, 3, 4, 5, 6};

/*
        try {
            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
          */
        /*  String message = e.getMessage();
            System.out.println(message);//Index 10 out of bounds for length 6*//*

         */
        /*   String str = e.toString();
            System.out.println(str);//java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 6*//*

            e.printStackTrace();

        }
        System.out.println("看看我执行了吗?");*/


        //正常的输出语句
        //System.out.println(123);

        //错误的输出语句(而是用来打印错误信息)
        System.err.println(123);
    }
}

好今天的分享就到这里

欢迎在评论区交流

一起学习,一起进步!

如果你能关注我

那就是对我创作的最大鼓励啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是奋斗小杨啊

小额打赏,激励更多精彩分享!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值