• JAVA异常类(简单明了)


    目录

    1.概念

    2.异常的家族体系

    3.异常的处理

    3.1LBYL(事前防御型)

    3.2EAFP(事后认错型)

    4.异常的抛出

    5.异常的捕获

    5.1异常的声明

    5.2异常的捕获

    5.3finally

    6.自定义异常类


    1.概念

    在生活中我们也经常会感到异常,比如我们身体的某个地方疼,那指定是有什么地方做了不对的事情,对于计算机来说,也是这样,当你的程序运行的不对了,也是有一些做的不好的事情锁导致的.所以我们就能得到定义

    Java 中,将程序执行过程中发生的不正常行为称为异常

    2.异常的家族体系

    让我们看一张图

    在这张图中,我们可以发现很多我们在写程序的时候可能遇到过的异常

    这里的Error是错误,我们先不说

    比如:NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组越界异常)等等

    另一方面,我们也可以从图中看出来,所有的异常最终都是继承Throwable类的,而异常时继承Exception的,这个类又分成运行时异常和受查异常(IOException)和非受查异常(RuntimeException)

    受查异常:又叫编译时异常,程序在编译的时候就会报错的异常,不能通过编译.例如我们前面说的clone接口,使用的时候需要处理异常,这种就是受查异常

    非受查异常:又叫运行时异常,就是程序可以通过编译,但是执行的过程中出现的异常.例如数组越界,栈溢出

    3.异常的处理

    3.1LBYL(事前防御型)

    这个比较抽象,我们用一段伪代码来理解

    1. boolean ret = false;
    2. ret = 登陆程序();
    3. if(!ret){
    4. 处理不登陆异常;
    5. return;
    6. }
    7. ret = 运行聊天窗口();
    8. if(!ret){
    9. 处理运行聊天异常;
    10. return;
    11. }

    在这里我们可以看到,当我们哪一步出现异常的时候,我们在后面解决了异常,这样后面只要能执行,就没异常了,即使有,也会在里面处理了

    但是我们可以看到,这个整个的逻辑比较混乱,冗余,所以我们引出第二种方法

    3.2EAFP(事后认错型)

    先斩后奏总是更容易取得原谅,所以有了这种处理方法,在java中也提供了相关的语法try{}catch(){}

    来和上面的伪代码对比

    1. boolean ret = false;
    2. try{
    3. 登陆失败;
    4. 运行失败;
    5. }catch (登陆失败){
    6. 处理登陆失败异常;
    7. }catch (运行失败){
    8. 处理运行失败;
    9. }
    10. }

    这里和上面的区别就是这里的异常时先触发了,然后再catch中去处理异常,代码的可读性提高了

    4.异常的抛出

    我们不仅可以让编译器抛异常,Java中是支持我们自己抛出异常的

    1. public class Main {
    2. public static void main(String[] args) {
    3. int[] a = new int[10];
    4. int i = 10;
    5. if(i == 10){
    6. throw new ArrayIndexOutOfBoundsException();
    7. }
    8. }
    9. }

    这里我们并没有去执行越界操作,只是给了一个i,然后如果i==10,我们直接手动抛出异常,得到的结果是这样的

    5.异常的捕获

    5.1异常的声明

    这里我们用throws关键字,写在方法的后面,代码如下

    public static void main(String[] args) throws CloneNotSupportedException

     这样其实作用是这里并不处理异常,只是把异常声明出来,交给方法的调用者去处理,给出提醒

    当调用者使用该方法时,必须进行处理,或者继续用throws进行声明

    注意:.声明的异常必须是Exception类或者Exception的子类,如果抛出多个异常,再后面用','隔开就好了

    5.2异常的捕获

    这里先说一下try-catch的语法

    try{可能出现异常的语句}

    catch(捕获的异常类型 e){异常的处理}

    这里的处理可以用这个方法进行对异常信息的打印e.printStackTrace();

    这里捕获是从上到下依次捕获的,我们一次只能捕获一个异常,且try异常只会的语句将不会再被执行

    5.3finally

    这里是在try-catch语法后面的东西,这个所包裹的是必定执行的语句(无论是否异常),例如

    1. public class Main {
    2. public static void main(String[] args) {
    3. try {
    4. System.out.println(1);
    5. }catch (Exception e){
    6. }finally {
    7. System.out.println("hahahaha");
    8. }
    9. }
    10. }

    我们得到的结果是这样的

     这个不仅如此,当我们try和catch中同时又return语句的时候,甚至会返回finally中的return语句,我们验证一下

    1. public class Main {
    2. public static int demo(){
    3. try {
    4. return 1;
    5. }catch (Exception e){
    6. }finally {
    7. return 2;
    8. }
    9. }
    10. public static void main(String[] args) {
    11. System.out.println(demo());
    12. }
    13. }

    可见finally的优先级是特别高的,它一般用于扫尾工作,就是发生异常了,对一些资源的关闭

     这里有一点容易忽略,如果我们没用捕捉到异常,异常就处理不了了?

    不是这样的,如果我们没用人工捕获到异常,那么这个异常会交给到JVM中去处理

    6.自定义异常类

    这个其实特别简单,直接看代码

    1. //先定义一个类,然后继承Exception或者它的子类
    2. class demoException extends RuntimeException{
    3. //创建构造方法,并帮助父类构造
    4. public demoException(String message){
    5. super(message);
    6. }
    7. //这里又构建了一个无参的构造方法
    8. public demoException(){
    9. }
    10. }

    就这个语法,我们就成功的写出来了一个异常类

    那你肯定想知道这里的messa是个什么玩意把

    1. class demoException extends RuntimeException{
    2. public demoException(String message){
    3. super(message);
    4. }
    5. }
    6. public class Main {
    7. public static void main(String[] args) {
    8. throw new demoException("哈哈哈哈");
    9. }
    10. }

    看这段代码的执行结果是什么

     可以看到,我们传入的message其实就是最后异常后面的提示符

    异常其实并不难,只是一个新事务,我们慢慢去接受就好了

    感谢阅读!!!

  • 相关阅读:
    【JAVA】-- 简易超市管理系统窗口(三)(实现思路+每步代码)
    安卓应用程序打包时超过64K限制会出现什么问题?如何解决这个问题?
    Web APIs:事件高级--DOM事件流及DOM事件流程代码验证
    iNFTnews | 500万高薪不在话下,元宇宙人才成香饽饽?
    java static作用
    剪映+json解析将视频中的声音转换成文本
    网络I/O_05多路复用器
    Codeforces Beta Round 5
    网络安全-学习手册
    拼多多Temu正式卷到巴西,买家和卖家又多了一个选择!
  • 原文地址:https://blog.csdn.net/qq_55546526/article/details/126769105