异常语法详解

异常语法详解

  • 一:异常的分类:
  • 二:异常的处理
    • 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("密码错误");
        }
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用GPT 搭建一个占星术、解梦、塔罗牌占卜和命理学服务

今天来尝试我们的占星术、解梦、塔罗牌占卜和命理学服务,揭开宇宙的奥秘并获得自我认识 聊天 GPT API 集成的 HTML5 模板。我们的目标是提供易于使用且高度可定制的 API 代码,使您能够训练自己的人工智能解决方案并将其添加到提示中。 我们的产品是可定…

window上Clion配置C++版本的opencv

window上Clion配置opencv 注意版本一定要对的上,否则可能会出错,亲测 widnows 11mingw 8.1.0opencv 4.5.5 mingw8.1下载地址https://sourceforge.net/projects/mingw/ 配置环境变量 cmake下载 安装完添加环境变量 来到官网,下载 windows 对…

C/C++通过位操作实现2个uint32_t合并为uint64_t

#include <iostream> using namespace std;int main() {uint32_t a 10;uint32_t b 600;//先将uint32_t的a转为uint64_t&#xff0c;此时a前面32位都是0&#xff0c;然后左移32位&#xff0c;此时右32位为0&#xff0c;最后加上uint32_t类型的b&#xff0c;填充右32位的…

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

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

Spring cloud - Hystrix服务限流、熔断及降级

Hystrix的作用 Hystrix的主要作用是在微服务环境下防止服务雪崩&#xff0c;确保服务弹性及可用性。 具体来说&#xff0c;Hystrix可以实现&#xff1a; 服务降级&#xff1a;通过fallback实现服务不可达情况下的服务降级作用。熔断&#xff1a;服务不可达的情况下在设定时间…

linux中利用fork复制进程,printf隐藏的缓冲区,写时拷贝技术,进程的逻辑地址与物理地址

1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h>int main(){printf…

Shell判断:流程控制—if(二)

一、多分支结构 1、语法&#xff1a; if 条件测试1 then 命令序列 elif 条件测试2 then 命令序列 elif 条件测试3 then 命令序列.... else 命令序列 fi 2、示例&am…

ERR:Navicat连接Sql Server报错

错误信息&#xff1a;报错&#xff1a;未发现数据源名称并且未指定默认驱动程序。 原因&#xff1a;Navicat没有安装Sqlserver驱动。 解决方案&#xff1a;在Navicat安装目录下找到sqlncli_x64.msi安装即可。 一键安装即可。 Navicat链接SQL Server配置 - MarchXD - 博客园 …

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

K-Means聚类

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 K-means聚类算法实现 技术细节 选取的数据集是sklearn.datasets里面的鸢尾花数据集&#xff0c;方便最后的算法评价。 根据手肘法&#xff08;即根据SSE代价函数&#xff09;得出最合适的k值。 此处思路是先根据E …

C++之常用算法

C之常用算法 for_each transform #include<iostream> using namespace std; #include<vector> #include<algorithm>class Tranfor { public:int operator()(int var){return var;} };class MyPrint { public:void operator()(int var){cout << var&l…

【机器学习】特征工程:特征选择、数据降维、PCA

各位同学好&#xff0c;今天我和大家分享一下python机器学习中的特征选择和数据降维。内容有&#xff1a; &#xff08;1&#xff09;过滤选择&#xff1b;&#xff08;2&#xff09;数据降维PCA&#xff1b;&#xff08;3&#xff09;sklearn实现 那我们开始吧。 一个数据集中…

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…

Linux操作文件的底层系统调用

目录 1.概述 2.open的介绍 3.write 的介绍 4.read 5.close的介绍 6.文件描述符 1.概述 C语言操作文件的几个库函数:fopen,fread,fwrite,fclose; 系统调用:open,read,write,close; 系统调用方法实现在内核中;(陷入内核,切换到内核) 2.open的介绍 open重载:两个参数用于打…

【0到1学习Unity脚本编程】第一人称视角的角色控制器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;【0…

【Gradle-13】SNAPSHOT版本检查

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

ROS参数服务器(Param):通信模型、Hello World与拓展

参数服务器在ROS中主要用于实现不同节点之间的数据共享。 参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 使用场景一般存储一些机器人的固有参数&…

系列四、强引用、软引用、弱引用、虚引用分别是什么?

一、整体架构 二、强引用&#xff08;默认支持模式&#xff09; 2.1、概述 当内存不足时&#xff0c;JVM开始垃圾回收&#xff0c;对于强引用的对象&#xff0c;就算是出现了OOM也不会对该对象进行回收&#xff0c;死都不收。 强引用是我们最常见的普通对象引用&#xff0c;只…

Gin框架源码解析

概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树&#xff08;基数树或者压缩前缀树&#xff09;、请求处理、路由方法树…

hypermesh学习总结(一)

1、hypermesh导入导出 2、hypermesh如何使用拓扑命令,连接多个几何体为一个? 3、hypermesh模式选择 分别有显示动力学模式explicit,标准模式Standard3D(静力学及模态等)