异常语法详解

news2025/1/20 18:35:19

异常语法详解

  • 一:异常的分类:
  • 二:异常的处理
    • 1:异常的抛出:throw
    • 2:异常的声明:throws
    • 3:try-catch捕获并处理异常
  • 三:finally关键字
  • 四:自定义异常类:

一:异常的分类:

1:编译时异常:在程序编译期间发生的异常,称为编译时异常,也称受查异常。
2:运行时异常:在程序执行期间发生的异常,称为运行时异常,也称非受查异常。RunTimeException以及子类构成的异常,都称为运行时异常。
编译时出现的语法错误,不能称为异常。比如拼写错误关键字。

二:异常的处理

1:异常的抛出:throw

在Java中,使用throw将异常抛出,将错误信息告知给调用者。
注意:
1:throw 必须写在方法的内部
2:抛出的对象必须是Exception或者是Exception的子类对象
3:如果抛出的是RunTimeException,或者是RunTimeException的子类,则可以不处理,直接交给JVM来处理
4:异常一旦抛出,其后的代码就不会再执行 。

举例说明:

public class Test {
    public static void fun(int[] array){
        if(array==null){
            throw new NullPointerException();//throw关键字来抛出运行时异常
            System.out.println("异常");//异常抛出,该句代码不会再执行
        }
    }
    public static void main(String[] args) {
        //此时fun()的调用者main()对异常也没有处理,将交给JVM来处理
        int[] array=null;
        fun(array);
    }
}

5:如果抛出的是编译时异常,用户必须处理,否则无法通过编译。

public class Test {
    public static void fun(int[] array) throws CloneNotSupportedException {
        if(array==null){
            throw new CloneNotSupportedException();//受查异常,必须处理,但可以通过throws关键字声明,交给调用者处理
        }
    }
    public static void main(String[] args) throws CloneNotSupportedException{
        int[] array=null;
        fun(array);//该调用者main()也没有处理,但也通过throws声明了,此时将交给JVM来处理
    }
}

2:异常的声明:throws

处在方法声明时的参数列表之后,当方法中抛出已换成那个时,用户不想处理该异常,就可以通过throws将异常抛给方法的调用者来处理。
当前方法不处理,交给该方法的调用者来处异常
注意:
1:throws必须跟在方法的参数列表之后
2:声明的异常必须是Exception,或者是Exception的子类;
3:方法的内部如果出现了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出的多个异常类型具有父子关系,直接声明父类即可。
4:调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用Throws抛出。

public class Test {
    public static void fun(int[] array) throws CloneNotSupportedException {
        if(array==null){
            throw new CloneNotSupportedException();//受查异常,必须处理,但可以通过throws关键字声明,交给调用者处理
        }
    }
    public static void main(String[] args) throws CloneNotSupportedException{
        int[] array=null;
        fun(array);//该调用者main()也没有处理,但也通过throws声明了,此时将交给JVM来处理
    }
}

3:try-catch捕获并处理异常

throws并没有对异常进行真正的处理,而是将异常报告给抛出异常方法的调用者,由调用者来处理,如果想要对异常进行处理,就需要try-catch。
注意:
1:try块内抛出异常位置后的代码即将不会被执行;
2:如果抛出的异常与catch时的异常不匹配,即异常不会被成功捕获,也不会被处理,继续往外抛,直到JVM来处理

public class Test {
    public static void fun(int[] array){
        try{
            System.out.println(array[10]);//抛出的是数组越界异常
            System.out.println(10/0);//抛出的是算数异常

        }catch (ArithmeticException e){//没有处理数组越界异常,将交给该方法的调用者来处理
            //但该方法的调用者main()并没有处理,将交给JVM来处理
            e.printStackTrace();
            System.out.println("算数异常");
        }
    }
    public static void main(String[] args) {
        int[] array={1,2,3,4};
        fun(array);
    }
}

在这里插入图片描述

3:try中可能存在多个不同的异常对象,则必须通过多个catch来捕获异常

public class Test {
    public static void fun(int[] array){
        try{
            System.out.println(array[10]);//抛出的是数组越界异常
            System.out.println(10/0);//抛出的是算数异常

        }catch (ArithmeticException e){//没有处理数组越界异常,将交给该方法的调用者来处理
            //但该方法的调用者main()并没有处理,将交给JVM来处理
            e.printStackTrace();
            System.out.println("算数异常");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("数组越界异常");
        }
    }
    public static void main(String[] args) {
        int[] array={1,2,3,4};
        fun(array);
    }
}

在这里插入图片描述

4:如果多个异常具有父子类关系,一定子类异常在前catch,父类异常在后catch ,否则语法错误。

public class Test {
    public static void fun(int[] array) {
        try {
            System.out.println(array[10]);//抛出的是数组越界异常
            System.out.println(10 / 0);//抛出的是算数异常

        }/*catch (RuntimeException e){
            e.printStackTrace();
            System.out.println("运行时异常");
            
        }*/ catch (ArithmeticException e){//没有处理数组越界异常,将交给该方法的调用者来处理
            //但该方法的调用者main()并没有处理,将交给JVM来处理
            e.printStackTrace();
            System.out.println("算数异常");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("数组越界异常");
        }catch (RuntimeException e){
            e.printStackTrace();
            System.out.println("运行时异常");

        }
    }
    public static void main(String[] args) {
        int[] array={1,2,3,4};
        fun(array);
    }
}

在这里插入图片描述
下面是错误代码:

public class Test {
    public static void fun(int[] array) {
        try {
            System.out.println(array[10]);//抛出的是数组越界异常
            System.out.println(10 / 0);//抛出的是算数异常
        }catch (RuntimeException e){
            e.printStackTrace();
            System.out.println("运行时异常");
        } catch (ArithmeticException e){//没有处理数组越界异常,将交给该方法的调用者来处理
            //但该方法的调用者main()并没有处理,将交给JVM来处理
            e.printStackTrace();
            System.out.println("算数异常");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("数组越界异常");
        }/*catch (RuntimeException e){
            e.printStackTrace();
            System.out.println("运行时异常");
        }*/
    }
    public static void main(String[] args) {
        int[] array={1,2,3,4};
        fun(array);
    }
}

在这里插入图片描述

三:finally关键字

在程序中有些特定的代码,不论程序是否发生异常,都需要被执行,比如程序中打开的资源:网站连接,数据库连接 ,IO流等,在程序正常或者异常退出时,必须对资源进行回收,此时必须使用finally来对资源进行回收。
1:有异常出现时:finally会被执行

public class Test {
    public static void fun(int[] array){

        try{
            System.out.println(array[10]);//存在数组越界异常
            
        }catch(ArrayIndexOutOfBoundsException e){
           e.printStackTrace();
            System.out.println("数组越界异常");
        }finally{
            System.out.println("finally被执行了");
        }

    }
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        fun(array);
    }
}

在这里插入图片描述2:当没有异常时,finally还会被执行

public class Test {
    public static void fun(int[] array){

        try{
           // System.out.println(array[10]);//存在数组越界异常

        }catch(ArrayIndexOutOfBoundsException e){
           e.printStackTrace();
            System.out.println("数组越界异常");
        }finally{
            System.out.println("finally被执行了");
        }

    }
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        fun(array);
    }
}

在这里插入图片描述3:异常没有被成功捕获,finally还是会被执行

public class Test {
    public static void fun(int[] array){

        try{
          System.out.println(array[10]);//存在数组越界异常

        }catch(ArithmeticException e){//捕获算数异常
           e.printStackTrace();
            System.out.println("算数异常");
        }finally{
            System.out.println("finally被执行了");
        }

    }
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        fun(array);
    }
}

在这里插入图片描述

finally执行时机: finally一定会被执行,无论程序是否异常,finally执行的时机是方法返回之前(try或者catch中如果有return,会在这个return 之前执行finally),如果finally中也存在return语句,那么只会执行finally中的return,而不会执行try中的return。

public class Test {
    public static int  fun(int[] array){

        try{
          System.out.println(array[10]);//存在数组越界异常
              return 10;
        }catch(ArithmeticException e){//捕获算数异常
           e.printStackTrace();
            System.out.println("算数异常");
        } catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("数组越界异常");
            return 20;
        } finally{
            System.out.println("finally被执行了");
            return 100;
        }

    }
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        int result=fun(array);
        System.out.println("result="+result);
    }
}

在这里插入图片描述【异常处理流程总结】
1:程序先执行 try 中的代码
2:如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
3:如果找到匹配的异常类型, 就会执行 catch 中的代码
4:如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
5:无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
6:如果上层调用者也没有处理的了异常, 就继续向上传递
7:一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止。

四:自定义异常类:

1:自定义异常类,然后继承来自Exception(默认是受查异常)或者来自RunTimeException(非受查异常)。
2:实现一个带String类型参数的构造方法,
参数含义:出现异常的原因
定义一个用户类,该用户有name,password两个成员变量:

public class Admin {
    //定义一个用户类,该用户有name,password两个成员变量
    public String name;
    public String password;

    public Admin(String name, String password) {
        this.name = name;
        this.password = password;
    }
    //登录方法
    public  void login(String name,String password) {
        if (!(this.name.equals(name))) {
            throw new NameException("用户名错误");
        }
        else if(!(this.password.equals(password))){
            throw new PasswordException("密码错误");
        }
        else{
            System.out.println("登录成功");
        }
    }
}

自定义 NameException 异常类,继承了RuntimeException:

public class NameException extends RuntimeException{
    //自定义 NameException 异常类,继承了RuntimeException
    public NameException() {

    }

    public NameException(String message) {
        super(message);
    }
}

自定义PasswordException 异常类,继承了RuntimeException:

public class PasswordException extends RuntimeException{
    //自定义PasswordException 异常类,继承了RuntimeException
    public PasswordException() {
    }

    public PasswordException(String message) {
        super(message);
    }
}

Test测试类:

public class Test {
    public static void main(String[] args) {
        Admin admin=new Admin("Admin","123456");
        try {
        admin.login("admin","123456");
        }catch (NameException e){
         e.printStackTrace();
         System.out.println("用户名错误");
       }catch (PasswordException e){
            e.printStackTrace();
            System.out.println("密码错误");
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1227921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电路的基本原理

文章目录 一、算数逻辑单元(ALU)1、功能2、组成 二、电路基本知识1、逻辑运算2、复合逻辑 三、加法器实现1、一位加法器2、串行加法器3、并行加法器 一、算数逻辑单元(ALU) 1、功能 算术运算:加、减、乘、除等 逻辑运算:与、或、非、异或等 辅助功能&am…

对vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类一文的补充

在【精选】vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类_vb.net打印标签_WormJan的博客-CSDN博客 这篇文章中,没有对含有字母的编码进行处理。这里另开一篇帖子,处理这种情况。 在那篇文…

【C++入门】拷贝构造运算符重载

目录 1. 拷贝构造函数 1.1 概念 1.2 特征 1.3 常用场景 2. 赋值运算符重载 2.1 运算符重载 2.2 特征 2.3 赋值运算符 前言 拷贝构造和运算符重载是面向对象编程中至关重要的部分,它们C编程中的一个核心领域,本期我详细的介绍拷贝构造和运算符重载。 1. …

Js中clientX/Y、offsetX/Y和screenX/Y之间区别

Js中client、offset和screen的区别 前言图文解说实例代码解说 前言 本文主要讲解JavaScript中clientX、clientY、offsetX、offsetY、screenX、screenY之间的区别。 图文解说 在上图中,有三个框,第一个为屏幕,第二个为浏览器大小&#xff0c…

约数个数定理

首先在讲这个定理前,首先科普一下前置知识 约数: 何为约数,只要能整除n的整数就是n的约数,举个例子,3的约束是1和3因为1和3能整除3 质数: 除了这个数字本身和1以外没有其他因子的数字就叫质数&#xff…

AVL树和红黑树

AVL树和红黑树 一、AVL树1. 概念2. 原理AVL树节点的定义插入不违反AVL树性质违反AVL树性质左单旋右单旋左右双旋右左双旋总结 删除 3. 验证代码4. AVL树完整实现代码 二、红黑树1. 概念2. 性质3. 原理红黑树节点的定义默认约定插入情况一 (u存在且为红)情…

论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 Arxiv 2023 | DMV3D: DENOISING MULTI-VIEW DIFFUSION USING 3D LARGE RECONSTRUCTION MODEL 使用3D大重建模型来去噪多视图扩散 论文原文:https://arxiv.org/pdf/2311.09217.pdf…

【2017年数据结构真题】

请设计一个算法,将给定的表达式树(二叉树)转换成等价的中缀表达式(通过括号反映次序),并输出。例如,当下列两棵表达式树作为算法的输入时: 输出的等价中缀表达式分别为(ab)(a(-d)) 和…

OpenAI Assistants-API简明教程

OpenAI在11月6号的开发者大会上,除了公布了gpt4-v、gpt-4-turbo等新模型外,还有一个assistants-api,基于assistants-api开发者可以构建自己的AI助手,目前assistants-api有三类的工具可以用。首先就是之前大火的代码解释器(Code In…

隐式转换导致索引失效的原因

Num1 int Num2 varchar Str1不能为null Str2可null 例子1: 结果:124非常快,0.001~0.005秒出结果。3最慢,4~5秒出结果。 查询执行计划:124索引扫描。3全表扫描。 解释:首先四个23都产生隐式转换&#x…

第7天:信息打点-资产泄漏amp;CMS识别amp;Git监控amp;SVNamp;DS_Storeamp;备份

第7天:信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份 知识点: 一、cms指纹识别获取方式 网上开源的程序,得到名字就可以搜索直接获取到源码。 cms在线识别: CMS识别:https://www.yun…

【Gradle-13】SNAPSHOT版本检查

1、什么是SNAPSHOT SNAPSHOT版本是指尚未发布的版本,是一个「动态版本」,它始终指向最新的发布工件(gav),也就是说同一个SNAPSHOT版本可以反复用来发布。 这种情况在大型app多团队的开发中比较常见,比如us…

【Linux系统化学习】进程的状态 | 僵尸进程 | 孤儿进程

个人主页点击直达:小白不是程序媛 Linux专栏:Linux系统化学习 目录 操作系统进程的状态 运行状态 阻塞状态 进程阻塞的现象 挂起阻塞状态 Linux进程状态 Linux内核源代码怎么说 R(running状态)运行状态 S(sl…

关于DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC的一些发现

任务在哪 这个是11g以后的自动收集统计信息的后台任务,10g之前是在dba_scheduler_jobs里查看 SQL> SELECT CLIENT_NAME ,STATUS ,MEAN_INCOMING_TASKS_7_DAYS,MEAN_INCOMING_TASKS_30_DAYS FROM DBA_AUTOTASK_CLIENT WHERE…

云课五分钟-0Cg++默认版本和升级-std=c++17

前篇: 云课五分钟-0B快速排序C示例代码-注释和编译指令 视频: 云课五分钟-0Cg默认版本和升级-stdc17 文本: 在Linux系统中,可以通过以下步骤升级g: 打开终端,使用root权限或者sudo权限登录。输入以下命令…

[AI]ChatGPT4 与 ChatGPT3.5 区别有多大

ChatGPT 3.5 注册已经不需要手机了,直接邮箱认证就可以,这可真算是好消息,坏消息是 ChatGPT 4 还是要收费。 那么 GPT-3.5 与 GPT-4 区别有多大呢,下面简单测试一下。 以从 TDengine 订阅数据为例,TDengine 算是不太小…

【C++】一文全解C++中的异常:标准库异常体系&自定义异常体系(含代码演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.C语言传统的处理错误的方式二.C异常…

python-opencv 培训课程笔记(1)

python-opencv 培训课程笔记(1) 博主参加了一次opencv库的培训课程,把课程所学整理成笔记,供大家学习,第一次课程包括如下内容: 1.读取图像 2.保存图像 3.使用opencv库显示图像 4.读取图像为灰度图像 …

每天一道算法题(六)——返回一组数字中所有和为 0 且不重复的三元组

文章目录 前言1、问题2、示例3、解决方法4、效果5、注意点 前言 注意:答案中不可以包含重复的三元组。 1、问题 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] n…

基于PHP+MySql的酒店信息管理系统的设计与实现

一、系统开发环境 运行环境:phpstudy或者wampserver, 开发工具:vscodephpstorm 数据库:mysql 二、酒店管理系统功能 1.前台功能: 首页客房推荐,周边特色介绍 酒店在线预订 订单查询,可以…