java零基础入门-异常、线程(下)

118 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

哈喽,各位小伙伴们好,我是喵手。

       今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流 学习,互相学习,才能成长的更快,对吧。

       我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

一、前言

       论前几期啊,我们是分别讲了Object类Date类FormDate类Calendar类System类StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。

       这一期我们要学习的知识点相对还是较多的,不知道大家做好了准备接收没有,这一期不仅要学习如何声明异常,捕获异常还要学习异常如何去处理等相关实操,希望大家都能在这一期中有所收获。

二、本期教学目标

  • Objects类之非空判断源码分析。
  • 掌握如何通过throws声明异常。
  • 掌握如何捕获异常。
  • 掌握如何使用finally关键字使用。
  • 掌握异常处理注意事项。

三、正文

1、Objects类

       这个类想必大家都比较熟悉,特别是判断一个对象是否为空,就很习惯使用该类提供的isNull()方法,可是有没有去看过它的实现源码?不知道大家有没有注意到它源码的该方法requireNonNull(),作用就是:判断校验饮用对象是否为null。而它的做法就是对空对象进行了异常抛出,通过使用throw关键字。

    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier.get());
        return obj;
    }

       异常不是说只有我们自己在正常编码中才会涉及,在很多方法源码中也是贯穿使用的,所以要学好异常,还是有很多地方是值得我们大家去挖掘与研究的。

2、声明异常throws

      上方所演示的Objects类就对异常有做抛出处理,而对于异常的声明,可就是用throws关键字了,何为声明?就是说将问题标识出来,反馈给调用者。

      如果方法内通过throw抛出异常,而没有捕获异常,那你就必须通过throws进行声明,继续抛出去,让调用这个方法的调用者去处理。

      那throws如何使用呢?如下是声明异常格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2...{ }

      给大家举个例子,这样你们就能看得明白了。

具体请看如下示例,仅供参考:

    private static void see(String bookType) throws FileNotFoundException {
        if(!"red.book".equals(bookType)){
            throw new FileNotFoundException("书不存在!");
        }
    }

    public static void main(String[] args) throws FileNotFoundException {
        see("red1.book");
    }

演示截图:

       解释一下:我只是给大家做个演示如何进行异常声明,假设不是[ “red.book” ]即进行异常抛出。接着调用者也要对该异常进行声明或者做出处理。上方可以看到我main方法调用see()方法也是直接将异常声明了出去。

       还有一点,throws进行异常声明,若该方法可能存在多种异常出现,那你就可以在throws后面写多个异常类,用逗号隔开即可。

比如如下演示:

private static void see(String bookType) throws FileNotFoundException, IOException {}

       那这样无限进行异常声明?也不是,你也可以对异常进行捕获自行处理。那怎么捕获?请接着看第三讲try...catch的使用。

3、捕获异常try...catch

       try...catch就是对异常进行捕获处理的方式,这也是java提供的对异常有针对性的语句进行捕获,对出现的异常进行指定方式处理。

捕获异常语法如下:

        try {

            //编写可能会出现异常的代码
        } catch (异常类型 e) {

            //处理异常的代码
            //比如:记录日志/打印异常信息/继续抛出异常等
        }

说明一下:

  • try:该代码块中编写可能产生异常的代码。
  • catch:用来捕获异常,实现对捕获的异常进行处理。

注意:try、catch必须连用,不能分开独用!

接下来我就还是按第二讲的那个例子来举例演示:

    private static void see(String bookType) throws FileNotFoundException {
        if(!"red.book".equals(bookType)){
            throw new FileNotFoundException("书不存在!");
        }
    }

    public static void main(String[] args) {
        try {
            see("red1.book");
        } catch (FileNotFoundException e) {//方法抛出什么异常,括号中就定义什么异常类型。

            //这里直接打印异常。(也是异常的一种处理方式)
            System.out.println(e);
        }
        System.out.println("over!");
    }

执行main方法控制台打印结果截图:

其中Throwable类中也定义了一些查看方法:

  • getMessage():获取异常的描述信息,异常原因(反馈给调用者,就提示错误原因,而不带异常类型)。
  • printStackTrace():打印异常跟踪栈信息并输出到控制台。
  • toString():获取异常的类型和异常描述信息(基本不用),直接输出即可。

具体演示可看下方截图:

4、finally代码块

       finally关键字,作用就是:在一些特定的代码无论异常是否出现,都需要执行,就可用它。比如很多处境,发现异常会导致程序执行不到,而finally就正好解决了这个问题,在finally代码块中的代码就一定会被执行的。

       那finally关键字怎么使用呢?注意啊,它也不能单独使用,必须和try...catch连用。

finally语法:

        try {

            //编写可能会出现异常的代码
        } catch (异常类型 e) {

            //处理异常的代码
            //比如:记录日志/打印异常信息/继续抛出异常等
        }finally {
        
            //异常是否发生,这里都会被执行。

        }

接下来给大家举个例子演示一下吧,省的大家看的一愣一愣的。

示例代码:

    private static void see(String bookType) throws FileNotFoundException {
        if(!"red.book".equals(bookType)){
            throw new FileNotFoundException("书不存在!");
        }
    }

    public static void main(String[] args) {
        try {
            see("red1.book");
        } catch (FileNotFoundException e) {//方法抛出什么异常,括号中就定义什么异常类型。
            //这里直接打印异常。(也是异常的一种处理方式)
            System.out.println(e);   //java.io.FileNotFoundException: 书不存在!
        }finally {
            System.out.println("这里我是一定会执行的!不管是否发生异常!");
        }
        System.out.println("over!");
    }

具体演示可看下方截图:

这是刻意制造会出现异常的情况.

这是不出现异常的情况:

这样对比演示,你们总能弄明白吧。

5、异常处理注意事项

       如上讲的都是对一个异常进行捕获,倘若一个方法同时出现多个异常,那又得怎么捕获处理呢?其实啊,这也好办,多次catch就可以了呀。

比如如下模板:

        try {
            //编写可能会出现异常的代码
        } catch (异常类型1 e) {

        } catch (异常类型2 e) {
        } finally {
            //异常是否发生,这里都会被执行。
        }

       有多少个异常就catc多少次。但是有个要求,对于多个catch,其中的异常类型不能相同,若catch中多个异常偶子父异常关系,那么子类异常要求在上面的catch处理,父类异常在下,这得按照异常子父顺序来catch。

​​... ...

       好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。

四、文末

       教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

-------------------------------------------

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

-------------------------------------------