Java之异常处理

异常

异常快速入门

先来看一段代码

package com.hansp.Exception;

public class Demo01  {
    public static void main(String[] args) {
        int num1=10;
        int num2=0;
        //1.分母为0
        //2.当程序检测到分母为0时,程序就会抛出异常ArithmeticException
        //3.当抛出异常后,程序会崩溃,下面的代码就不会再运行
        //4.这样的代码,一个小错误,就会导致整个程序不能运行,以后设计软件的时候不太使用,健壮性太差
        //5.java提供了一个异常处理机制来解决该问题
        //可以用try-catch来处理
        //6.可以选中你认为可能出错的代码区域,用ctrl+alt+t跳出界面,然后选择6
        //如果进行异常处理,那么即使出现了异常,程序也可以继续执行

        try {
            int res=num1/num2;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());//可以输出异常信息
        }
        System.out.println("程序继续运行....");
    }
}

运行结果
在这里插入图片描述

一些理解

在程序执行过程中发生的不正常行为称为异常(开发过程的语法和逻辑错误不算)
包括那种在idea上就标红的
和运行时检测出来的

而且异常的出现会导致程序停止运行,导致代码的健壮性太差
不可能只因为一个小错误,终止整个程序
所以出现了异常处理机制
来保证小错误不会影响整个程序的运行

异常基本介绍

在程序执行过程中发生的不正常行为称为异常(开发过程的语法和逻辑错误不算)

异常事件分为两大种
在这里插入图片描述

第一种是无法用异常处理机制的

第二种介绍异常处理机制针对的对象了

异常体系图

在这里插入图片描述

这里的Exception只列举了几个常见的异常,还有很多异常,大家可以在idea上查看

异常概念小结

在这里插入图片描述

编译时异常:一般来说,你在写代码出现的红标就是编译时异常
有红色下划线
如图
在这里插入图片描述
这种异常需要在编译器上马上处理,不然代码不能跑,!!!!!,抛出或者处理,需要自己写代码操作

运行时异常:像那种运行时才能检查处理的异常,比如分母为0什么的
下面会介绍五大运行时异常
运行异常都是默认抛出!!!

五大运行时异常

空指针异常

1.继承关系
在这里插入图片描述
2.举例在这里插入图片描述

3.解释
当程序试图调用对象的地方是null时候,会抛出空指针异常
上面的程序name.length()明显需要name指向一个String对象
但是它却是空,没有长度的,所以会报错

数字运算异常

1.继承关系
在这里插入图片描述
2.例子
上面的/0的例子解释数字运算异常
3.解释
当出现异常的运算条件时,抛出此异常,例如一个整数除以0

数组下标越界异常

1.继承异常在这里插入图片描述

2.例子在这里插入图片描述
3.解释
arr数组三个值arr[0],arr[1],arr[2];
<=arr.lengrh();就是小于等于3
但是并没有arr[3]的对应对象,此时数组下标访问越界,所以抛出数组越界异常

类型转换异常

1.继承关系
在这里插入图片描述
2.例子
在这里插入图片描述
3.把一个B类的实例b转为C类的实例,显然不对所以会报类转换异常

数字格式不正确异常

1.继承异常
在这里插入图片描述
2.例子
在这里插入图片描述

3.解释
当应用程序尝试试图将字符串转换为一种数值类型,但该字符串不能转换为适当格式时,抛出该异常(字符串转型那个pase对象形式)
使用该异常可以确保输入是满足条件数字

编译异常

在这里插入图片描述

异常处理机制

try-catch-finally

程序员捕捉发生的异常,自行处理

用法示意图

在这里插入图片描述

细节及使用方法在这里插入图片描述

在这里插入图片描述
然后在try中遇到异常跳入catch中,然后有finally跳入finally
之后的话程序是不会停止运行的,会调到try-catch-fianlly外面的紧接的代码继续运行,如上图

4.如果try中有多个异常(异常类型相同),会先捕获前面的异常,然后处理,后面那个异常是不执行的,都在try里
如果想对不同异常分开捕获进行对应的处理,要对异常的类型具体区分,进行多个catch,来捕获你想捕获的异常

在这里插入图片描述
父类异常要放在子类的异常后面,要不然父类就把子类的异常处理了,你写子类的异常有什么用呢?
比如这样就是不对的
在这里插入图片描述
这个获取异常是运行时检测到异常,直接到对应的catch然后到finally,不会是有catch的异常全部捕获
只会运行首先捕获的异常对应的catch中的代码和finally中的

5.在这里插入图片描述

throws

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

程序员没有显示是处理异常默认是throws

处理示意图

在这里插入图片描述

JVM处理异常
就是输出异常信息然后终止程序的运行

public static void main(String args[]) thorows Exception(抛出异常是默认的,所以我们有异常时,会给到JVM,JVM就输出异常信息,然后停止程序运行)

细节及使用方法

演示类是编译异常,运行异常默认就是抛出

抛出异常前
在这里插入图片描述

抛出异常后(会让调用者处理)
在这里插入图片描述

throws可以接你想抛出的异常,如果你想有异常就抛出(不用判断异常的类型)可以自己写
throws Exception
也可以抛出多种异常throws 异常种类1,异常种类2,异常种类3;在这里插入图片描述

细节

在这里插入图片描述
1和2上面有案例
3在这里插入图片描述
4为1和2的总结啊

5.编译异常的抛出也需要处理(在调用方法里处理)
编译异常f1()需要处理调用的f3()抛出的异常
在这里插入图片描述
可以抛出或者try-catch

运行异常抛出,是默认抛出的,f4()调用的抛出异常的f5()然后,f4()默认抛出f5()抛出的异常如果一直不处理最后会由JVM处理在这里插入图片描述

自定义异常

当程序出现了"错误",但是该错误并没有在Throwable里面子类中描述,可以自己设计异常类,用于描述该错误信息

步骤

在这里插入图片描述
3需要注意
案例
在这里插入图片描述

throw和throws

在这里插入图片描述
throws
带一个异常类型
在这里插入图片描述
throw
带一个具体异常对象
在这里插入图片描述

应用

package com.hansp.Exception;

public  class EcmDef {
    static public int cal(int n1, int n2){

            return n1/n2;


    }

    public static void main(String[] args) {

        try {
            if (args.length!=2){
                throw new ArrayIndexOutOfBoundsException("参数个数必须为两个");
            }
            int n1=Integer.parseInt(args[0]);
            int n2=Integer.parseInt(args[1]);
            double res=cal(n1,n2);
            System.out.println("计算结果是"+res);

        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
        }
        catch (NumberFormatException e){
            System.out.println("参数格式不正确,需要重谢");
        }
        catch (ArithmeticException e){
            System.out.println("出现了除0的异常");


        }System.out.println("牛牛牛");

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值