1.1(Java高级特性)异常处理

**扯淡:**大家好,欢迎大家观看这篇文章,我是一个java的初学者。准备在22年2月7号之后找工作了,现在做一个70天大冲刺笔记。从java高级特性到微服务架构的整体笔记(也算是我走的路线了)。从今天开始要做个自律啦(希望大家喜欢)欢迎大家一起讨论学习,我是初学者瑟瑟发抖

这里我所有的笔记都是来源于网上视频:尚硅谷,黑马等这两个地址视频非常牛逼

硅谷

https://www.bilibili.com/read/cv5216534?spm_id_from=333.999.0.0

黑马

https://www.bilibili.com/read/cv9965357?spm_id_from=333.999.0.0

这一个,来源于,硅谷的30天java中的高级部分

硅谷,黑马的笔记有需要可以向我要哦

异常处理

什么是异常

我们在编写java代码的时候,运行的时候经常会出现异常。这个时候程序就会停止。

当然我们有的时候即使报错,我们也不想让程序停止,而是可以继续执行。

在Java语言中,将程序执行中发生的不正常情况称为“异常” 。

(开发过程中的语法错误和逻辑错误不是异常)

我们因为逻辑产生的问题,一般不会影响到程序中断,只是产生的结果和我们想的不一样。

java程序异常分类

Error

Java虚拟机无法解决的严重问题。JVM系统内部错误、资源 耗尽等严重情况。

比如:

public class ErrorTest {
    
    
    public static void main(String[] args) {
    
    
    
//        通过让栈溢出达到的异常
//Exception in thread "main" java.lang.StackOverflowError
        main(args);
        
    }
}

Exception

其它因编程错误或偶然的外在因素导致的一般性问题,可以使 用针对性的代码进行处理。

例如:

  1. 空指针访问
  2. 试图读取不存在的文件
  3. 网络连接中断
  4. 数组角标越界

exception下异常分类

编译异常(checked异常)

捕获错误最理想的是在编译期间,在运行前就能通过IDEA等工具看到

可以进行异常处理的

在这里插入图片描述

在这里插入图片描述

运行时异常

有的错误只有在运行时才会发生。

除数为0,数组下标越界等

在这里插入图片描述

异常类型图

在这里插入图片描述

Throwable:异常的父类,下面又存在很多的划分

Error:错误属于JVM异常,不好去处理(这里我其实也不懂55)

Exception:正常我们经常能遇到的异常。分为checked异常运行时候异常

硅谷的视频真的很厉害,值得推荐

在这里插入图片描述

处理方式

对于异常我们一般使用有两种方式

  1. try-catch-finally
  2. throws(抛出)

Try-catch-finally

语法

在这里插入图片描述

示例

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

//        因为数组长度是5,下标从0开始。
//        所以我这里一定会出现运行时候异常
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

        int [] intArr = new int[5];

        try {
    
    
            System.out.println("运行可能出现异常的部分");
            //这一段可能会出现异常。
            intArr[5] = 1;
            System.out.println("运行可能出现异常的部分后");
        } catch (ArrayIndexOutOfBoundsException e){
    
    
            System.out.println("捕获异常消息"+e.getMessage());
        }catch (Exception e) {
    
    
            e.printStackTrace();
        }
        System.out.println("异常处理完毕------------");

    }
}

在这里插入图片描述

根据结果分析

首先我们知道try中的代码一定会出现异常(我们自己编写的)

这个时候我们在它上面编写打印语句,因为当try中出现异常,try中就不会继续执行

就会进行catch的异常类型匹配

注意:这里的catch条件类似于switch中的匹配,多选一父类异常不能出现在子类异常之上,因为如果在子类异常之后,就不会考虑到子类。子类也就失去了编写的意义,同时catch()模块也会出现check异常

发现:上面虽然还是报出了异常,但是程序并没有终止,而是继续执行完毕

异常类常用两个方法

我们上面代码可以看到,catch中异常类也是存在方法可以进行调用的

方法 描述
getMessage() 返回异常信息,String返回值
printStackTrace() 打印堆栈信息,会在控制台中打印很多信息,和以前的出错样式一样,但是并不会影响之后的执行

finally

finally:就是无论怎么样,最终都会进行执行的模块

无论:try中是否存在return,catch:又出现异常或进行return finally模块还是会执行

finally的作用

我们在IO操作或者JDBC操作的时候很多时候都需要进行关闭一些资源。避免资源的浪费

所以我们在程序出现异常,等情况,可以使用finally进行资源的关闭。等操作

Throws(声明抛出异常)

如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这 种异常,

则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,

而由该方法的调用者负责处理。

示例

通过实例进行展示,通过注释编号读取内容

public class TrowsExceptionTest {
    
    

    //6.当然 main()也是可以继续抛出异常,交给jvm处理
//    最好还是在main方法中自行处理
    public static void main(String[] args) throws Exception {
    
    
        TrowsExceptionTest tet = new TrowsExceptionTest();
        tet.TrowseTestTwo();

    }
    
    public void TrowseTestTwo() throws InterruptedException,Exception{
    
    
//3.进行调用One方法发现,同样也出现了Checked异常
//        4.因为 one并没有处理异常,异常还在,只是交给了调用者进行处理
//        5.所以two选择继续抛出
        TrowsTestOne();
    }

    public void TrowsTestOne()throws InterruptedException,Exception{
    
    

        //1.线程休眠是一个Cheked异常,这里我并没有使用try-catch进行处理
//        2.而是将异常进行抛出
        Thread.sleep(1000);
    }


}

注意

调用者抛出异常类型不能小于 调用方法的异常。(会出现checked提示的)

try-catch-finally比较Trows

try-catch,可以进行的操作更多,使用起来更加丰富

硅谷的建议

在这里插入图片描述

Throw(手动抛出异常)

在执行过程中,我们自己创建一个异常。运行到此会不进行异常处理,会报checked异常或运行时异常

取决于手动抛出什么类型异常

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

//        通过Try-catch进行异常处理
        try {
    
    
            ThrowTestOne(-2);
        } catch (Exception e) {
    
    
//            打印异常的信息
            System.out.println(e.getMessage());
        }

    }


//    一般进行判断,来是否抛出异常。抛出的异常也是需要处理的哦
    public static void ThrowTestOne(int num){
    
    

//        如果这个方法的参数num小于0就抛出一个运行时候异常
        if(num<0){
    
    
            throw new RuntimeException("num小于0");
        }
    }

}

在这里插入图片描述

自定义异常类

一般地,用户自定义异常类都是RuntimeException的子类。

自定义异常类通常需要编写几个重载的构造器。

自定义异常需要提供serialVersionUID 起到唯一表示的作用

自定义的异常通过throw抛出。

自定义异常最重要的是异常类的名字,当异常出现时,可以根据 名字判断异常类型。

示例

创建自定义异常类

在这里插入图片描述

使用自定义异常类

正常的调用

在这里插入图片描述

おすすめ

転載: blog.csdn.net/weixin_46401545/article/details/121447906