JAVA异常知识点总结

JAVA异常

认识常见的异常
除0异常
int i = 0;
int j =10;
System.out.println(j/i);

因为被除数不能为0所以这时候就会爆出异常

在这里插入图片描述

空指针异常
String str = null;
str.charAt(0);

空指针异常就是用空对象调用了方法或者属性,例如这里的str字符串为空,调用charAt方法就会爆出空指针异常
在这里插入图片描述

数组越界异常
int[] arr = {1,2,3};
//数组越界
System.out.println(arr[10]);

数组越界异常、和以后的一些集合越界异常一样都是访问了超出实际大小的索引

在这里插入图片描述

注意:出现异常之后位于异常之后的代码也无法正常执行

避免异常的两种方式
  • 在操作之前进行充分的检查

  • 先操作遇到异常再进行处理

异常常用的语法
try{
    //存放所有可能出现异常的代码
}catch(捕捉相应的异常)...{
    //出现异常后的解决方式
}finally{
    //不是强制要求写的
    //无论是否发生异常,都会执行finally代码块,一般用来执行资源释放
    //比如jdbc,mybatis等资源获取后关闭资源
}
使用try…catch…处理异常
int[] arr = {1,2,3};
try{
    //发现这个地方可能存在异常,然后把它放在try语句中
    System.out.println(arr[10]);
    //把异常类型放在catch块中
}catch (ArrayIndexOutOfBoundsException e)
{
    //再这里说明处理异常的方式,我在这里打印一句话:数组下标越界
    System.out.println("数组下标越界");
}
System.out.println(arr[1]);

将可能报错的代码放在try中,并用catch进行捕捉,当出现异常之后,不影响异常代码块之后的代码正常运行

在这里插入图片描述

多个catch块的情况
int[] arr = {1,2,3};
try{
    arr=null;
    //这个地方存在一个空指针异常,也有可能存在数组越界异常,但是我再catch块中只包含了数组越界异常
    System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e)
{
    System.out.println("数组下标越界");
}
System.out.println(arr[1]);

这个地方存在一个空指针异常,也有可能存在数组越界异常,但是我再catch块中只包含了数组越界异常,这样的话就拦不住空指针异常

在这里插入图片描述

这种情况可以通过添加catch块的方式来解决

 int[] arr = {1,2,3};
        try{
            arr=null;
            System.out.println(arr[10]);
        }catch (ArrayIndexOutOfBoundsException e)
        {
            System.out.println("数组下标越界");
        }catch (NullPointerException e)
        {
            System.out.println("有一个空指针异常");
        }

当存在多个catch块的情况的时候,会一次检测catch块当中存在的异常,匹配到相应的异常就会执行相应的操作

注意:当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这样如果父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会获得匹配的机会,也即子异常类型所在的catch语句块将是不可到达的语句。所以,一般将父类异常类即Exception老大放在catch语句块的最后一个。

Exception异常
int[] arr = {1,2,3};
try{
    arr=null;
    System.out.println(arr[10]);
} catch (Exception e)
{
    System.out.println("我可以接收所有的异常");
}

在这里插入图片描述

他可以用来接收所有的异常对象,只要发生了异常,都可以向上转型为Exception对象,但是使用Exception异常对象来捕捉异常的方式不推荐,当程序出现多种异常,还是推荐使用明确的异常进行捕捉,这样更加明确更好解决问题

异常错误的输出

在java中,一切皆是对象,异常也是对象上面写的空指针,数组越界,Exception->都是异常,类产生错误的时候,jvm会构造一个相应的异常类对象传递给程序.

finally代码块
   int[] arr = {1,2,3};
   try{
        arr=null;
        System.out.println(arr[10]);
    } catch (Exception e)
    {
        System.out.println("我可以接收所有的异常");
    }finally{
        System.out.println("无论如何都会执行我");
    }
}

在这里插入图片描述

  • 通过运行发现,无论异常是否产生,finally代码块中的内容一定会执行.那么我们就将资源关闭操作放在finally代码块当中,最终执行的代码,用作善后处理
  • 能够走到finally就说明try和catch中的逻辑已经处理完了,只剩下finally的最后处理操作

以打开文件为例:

File file = new File("test.txt");
try {
    Scanner sc = new Scanner(file);
    System.out.println("文件加载完毕");
} catch (FileNotFoundException e) {
    System.out.println("文件不存在");
    e.printStackTrace();
}finally {
    System.out.println("文件正常处理完毕");
}
关于异常的返回值问题

一个小例:

public static int testException()
{
    try {
        String str = null;
        System.out.println(str.equals("123"));
        return 1;
    }catch (NullPointerException e)
    {
        return 2;
    }finally {
        System.out.println("我是finally我殿后");
        return 3;
    }
}

在这里插入图片描述

通过这个方法执行的结果可以发现,最终返回的是finally中的return值,所以一旦finally中带了返回值,相当于try和catch当中的返回值就失效了,无论是否有异常产生,finally一定会执行,因此会覆盖try和catch的返回值

关于异常的关键字
  • throws:用在方法声明上,明确表示该方法可能会产生异常,但是这个方法自己不处理这个歌异常,谁调用它就在调用的时候处理

    public void test() throws NullPointerException,ArrayIndexOutOfBoundsException{
        String str = null;
        System.out.println(str.length());
        int[] arr = {1,2,3};
        System.out.println(arr[10]);
    }
    
  • throw:用在方法的内部,人为产生异常对象并抛出,再调用这个方法执行的时候,就会爆出我们自己抛出的这个异常

    public static void fun()
    {
        throw new NullPointerException("没事干报个空指针");
    }
    

在这里插入图片描述

异常结构体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WK1zGQdW-1643021806741)(C:\Users\zhengbo\AppData\Roaming\Typora\typora-user-images\image-20220124162226906.png)]

  • 其中Error指的是java运行内部错误和资源耗尽错误,应用程序不会抛出此类异常,这种内部错误,除了告知用户并使程序终止之外,再无能无力,这种情况很少出现,并且这种错误我们程序员无法捕捉,一旦发生Error错误,程序只能告知用户出现错误,程序直接退出.
  • StackOverflowError:栈溢出错误,一般发生在递归调用链太深,递归没有出口
  • OutOfMemoryError:堆溢出错误
  • Exception是我们程序员使用的异常类的父类
  • java的异常体系分为两大类
    • 非受查异常
      • 非受查异常:图中蓝色方框以及其子类都是属于非受查异常,所有的非受查异常不强制程序使用try…catch进行处理
      • Error以及RuntimeException(运行时异常,空指针,类型转换,数组越界)以及其子类都是属于非受查异常
    • 受查异常
      • 图中红色框以及其子类都是属于受查异常
      • 除了非受查异常之外的都是受查异常,必须使用try…catch进行异常处理,或者使用throws进行抛出
      • 除了Error和RuntimeException以及其子类的其他异常都是受查异常,必须显示处理
自定义异常类
  • 在程序开发中,一定会有一些错误和具体的业务相关的,这种错误JDK是不可能提供相应的异常类,此时我们就需要继承已有的异常类,产生自定义的异常类

  • 如果需要用户显示处理异常,继承RuntimeException父类,非受查异常

  • 小例,模拟登录检查,指定用户和密码登录

  • public class demo01 {
    
        private static final String USERNAME = "啵唧~";
        private static final String PASSWORD = "123456";
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入账号");
            String username = sc.next();
            System.out.println("请输入密码");
            String password = sc.next();
            try {
                login(username,password);
                System.out.println("登陆成功");
            }catch (userNameException e)
            {
                e.printStackTrace();
            }catch (passwordException e)
            {
                e.printStackTrace();
            }
    
        }
        //因为userNameException时受查异常,所以在这里抛出,让调用者处理
        public static void login(String username,String password) throws userNameException {
           if (!username.equals(USERNAME))
           {
               throw new userNameException("用户名错误");
           }
            if (!password.equals(PASSWORD))
            {
                throw new passwordException("密码错误");
            }
        }
    }
    //账号异常,使用Exception受查异常,到时候抛出
    class userNameException extends Exception
    {
        public userNameException(String msg)
        {
            super(msg);
        }
    }
    //密码异常,使用RuntimeException非受查异常
    class passwordException extends RuntimeException
    {
        public passwordException(String msg) {
            super(msg);
        }
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值