Java异常分类处理抛出捕获操作详解

 更新时间:2022年09月21日 09:48:42   作者:白朝槿kk  
异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

什么是异常

“程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。”

我们在平时写代码的过程中就可能会遇到异常,给大家给举一些容易遇到常见的异常例子:

1.算术异常

Exception in thread “main” java.lang.ArithmeticException: / by zero

在JAVA中,我们都知道0不能作为除数,只能作为被除数,如果把0作为除数,编译器就会提示我们出先算术异常了。

2.数组越界异常

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 5

数组越界,我们应该也不陌生,在使用数组时,如果超过了数组的大小,就会形成越界。程序就会发生异常,从而终止运行。

3.空指针异常

Exception in thread “main” java.lang.NullPointerException

对于数组arr,让它赋值为null,我并没有让它指向任何对象,它就是一个空指针。对于空指针进行访问,编译器就会提示我们空指针异常。

异常的分类

在代码运行时,可能会出现异常种类有很多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

图画的不是很好,大家凑合着看吧。下面为大家讲解一下这张图:

1.Throwable类是Java语言中所有错误(errors)和异常(exceptions)的父类。

2.Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等。

3.Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为运行时异常和编译时异常。

编译时异常

编译时异常,也称为受检查异常。从名字我们就能够理解,就是程序在编译的时候发生的异常。

运行时异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常。

编译时出现的语法性错误,不能称之为异常。编译过程中就会出错, 这是 “编译期” 出错。而运行时指的是程序已经编译通过得到class 文件了,再由 JVM 执行过程中出现的错误.

在Java中,异常处理主要的5个关键字:throw、try、catch、finally、throws

在讲异常处理之前,我们先要了解一下异常处理中的关键字,接下来我会一一为大家介绍这些关键字。

异常的抛出(throw关键字)

在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者

使用方法:throw new XXXException(“异常产生的原因”);

例如:

public static void main(String[] args) {
            throw new RuntimeException();
        }

虽然代码没错,但是我是使用throw抛出的一个异常,所以程序就会反馈给我一个异常。

给大家总结一下throw在使用过程中要注意的一些地方:

  1. throw必须写在方法体内部
  2. 抛出的对象必须是Exception 或者 Exception 的子类对象
  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
  5. 异常一旦抛出,其后的代码就不会执行

异常的捕获

异常的捕获,就是异常的具体处理方式,主要有两种:异常声明throws 和try-catch捕获然后进行处理。

throws关键字

throws一般位于方法声明时参数列表之后。

使用方法:修饰符 返回值 方法名(形参)throws 异常类型(可以有多个异常类型)

声明的异常必须是 Exception 或者 Exception 的子类

如果有多个异常,有用逗号隔开,如果抛出的异常具有父子类关系,可以直接throws父类

但是不建议直接用throws父类,范围太大了。throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果要处理异常就要使用try-catch进行处理。

try catch关键字

使用方式如下所示:

public static void main(String[] args) {
            try{
                //代码
            }catch (){//()里面写你想捕捉的异常
                //处理异常的代码
            }catch (){
				//同上
            }
        }

1.try里面的代码不一定会发生异常。

2.如果代码发生了异常,且被catch捕获到了,就会进行对应的处理,处理完成后就会跳出try-catch执行后面的语句。

3.如果代码发生了异常,但不是写catch语句预期捕捉的异常的话,那么这个异常不会捕捉到,后面的代码就不会被执行。

4.try-catch可以捕捉多个异常,但不是同时捕获。如果有多个异常,只能逐个捕获。

5.如果有多个异常,并且有父子类关系,可以直接写Exception,因为它是所有异常的父类,但是也不建议这么写,因为Exception的范围太广了,因为每个异常处理的方法不一样。

6.如果使用Exception,那么在写catch的时候,要么只写一个catch语句,里面放Exception,后面就不能继续写catch语句了,因为写了也没什么用,而且出现的异常都会被Exception进行捕获。要么就把Exception放在最后写,前面写你想捕获的异常,在最后再使用Exception。

7.try里面抛出异常位置之后的代码将不会被执行

finally关键字

finally的使用很简单,使用方式如下:

 public static void main(String[] args) {
            try{
                //代码
            }catch (RuntimeException e){
                //()里面写你想捕捉的异常
                //处理异常的代码
            }catch (Exception e){
				//同上
            } finally{
        		//代码
         }
    }

finally的作用:finally后面的代码一定会执行

前面讲了try-catch用来捕获并处理异常,但是有时发生的异常并没有被捕捉到,那么程序也会发生异常终止,但用户在使用的时候发生异常并终止程序,我们也需要对此进行进行一定的处理,就可以使用finally关键字,无论有没有发生异常,finally内的代码也一定会执行。

总结

异常处理的流程

  1. 程序先执行 try 中的代码
  2. 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
  3. 如果找到匹配的异常类型, 就会执行 catch 中的代码
  4. 如果没有找到匹配的异常类型, 异常得不到处理,就会交给JVM处理,程序就会异常终止.
  5. 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).

除此之外,大家也要熟练掌握异常的种类和throw、try、catch、finally、throws这几个关键字的用法。

到此这篇关于Java异常分类处理抛出捕获操作详解的文章就介绍到这了,更多相关Java异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中的JsonSerializer用法,前后端单位转换必备

    java中的JsonSerializer用法,前后端单位转换必备

    这篇文章主要介绍了java中的JsonSerializer用法,前后端单位转换必备!具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java开发之读写txt文件操作的实现

    java开发之读写txt文件操作的实现

    本篇文章介绍了,java开发之读写txt文件操作的实现。需要的朋友参考下
    2013-05-05
  • Spring整合Mycat2的具体过程详解

    Spring整合Mycat2的具体过程详解

    这篇文章主要给大家介绍Springboot整合Mycat2的具体过程,文中有详细的图解过程,感兴趣的小伙伴可以跟着小编一起来学习
    2023-05-05
  • 关于BeanUtils.copyProperties(source, target)的使用

    关于BeanUtils.copyProperties(source, target)的使用

    这篇文章主要介绍了关于BeanUtils.copyProperties(source, target)的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • spring mvc+localResizeIMG实现HTML5端图片压缩上传

    spring mvc+localResizeIMG实现HTML5端图片压缩上传

    这篇文章主要为大家详细介绍了使用spring mvc+localResizeIMG实现HTML5端图片压缩上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java的long和bigint长度对比详解

    Java的long和bigint长度对比详解

    在本文中小编给大家分享了关于Java的long和bigint长度比较的知识点内容,有兴趣的朋友们学习参考下。
    2019-07-07
  • java中如何使用HttpClient调用接口

    java中如何使用HttpClient调用接口

    这篇文章主要介绍了java中如何使用HttpClient调用接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Spring容器刷新obtainFreshBeanFactory示例详解

    Spring容器刷新obtainFreshBeanFactory示例详解

    这篇文章主要为大家介绍了Spring容器刷新obtainFreshBeanFactory示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java 数据结构与算法系列精讲之数组

    Java 数据结构与算法系列精讲之数组

    数组是有序的元素序列,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式
    2022-02-02
  • Java中向文件写入数据的几种常见方式分享

    Java中向文件写入数据的几种常见方式分享

    在日常开发中,肯定离不开要和文件打交道,今天就简单罗列一下平时比较常用的创建文件并向文件中写入数据的几种方式,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10

最新评论