五分钟”手撕“异常

目录

一、什么是异常

二、异常的体系和分类

三、异常的处理

1.抛出异常

2.异常的捕获

 异常声明throws:

try-catch处理

四、finally 

finally一定会被执行吗? 

五、throw和throws区别

六、异常处理的流程

七、自定义异常


一、什么是异常

顾名思义:就是不正常。比如:

当一个正在运作的机器突然卡了,或者不动了,我们称为异常;

当一个健康的人突然生病了,身体开始不舒服,我们称为异常。

所以:在Java中,将程序执行过程中发生的不正常行为称为异常

二、异常的体系和分类

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构,Java中的异常是用类来描述的,有各种各样的异常类: 、

 从上图可以看到的体系

1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception

2. Error指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowError和OutOfMemoryError,一旦发生回力乏术

3. Exception异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说 的异常就是Exception。

 

 从上图可以看到的分类

但我们平常说的异常是Exception,它可以分为编译时异常 or 受查异常(check Excepton)和运行时异常 or 非受查异常(uncheck Exception) 。

1.运行时异常,也叫非受查异常,它是用RuntimeException这个类继承的,就是在我点击run运行的时候,它才会报错 

public static void main(String[] args) {
        //算术异常
        System.out.println(10/0);
        //数组越界异常
        int[] array = new int[10];
        System.out.println(array[10]);
        //空指针异常
        int[] array1 = null;
        System.out.println(array1.length);
    }

2.编译时异常,也叫受查时异常,我之前博客也有写过克隆接口,就是在写代码的时候直接报红线,你都编译都不通过: 

class Person implements Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class Test {
    public static void main(String[] args) {
        //编译时异常 也叫 受查异常
        Person person = new Person();
        Person person1 = (Person) person.clone();
    }
}

当然,大家要注意:语法错误不算异常!!!! 比如:下图,少了个分号(中文分号,变量名重复,关键字拼写错误....等等都只算语法错误,并不是异常)

  

三、异常的处理

既然我们知道异常影响代码的工作,那我们怎么处理呢?

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

1.抛出异常

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

public static void getElement(int[] arr, int index)  {
        if (arr == null) {
            throw new NullPointerException("数组为空");
        }if(index<0||index>=arr.length){
            throw new ArrayIndexOutOfBoundsException("数组越界");
        }
}
public class Test{
    public static void main(String[] args) {
        int[] array = {1,2,3};
        getElement(array, 3);
        System.out.println("你好");
    }
}

【注意事项】:

1. throw必须写在方法体内部。

2. 抛出的对象必须是Exception 或者 Exception 的子类对象。

3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,代码不报错不划红线,则可以不用处理,直接交给JVM来处理

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

5. 异常一旦抛出,其后的代码就不会执行 。

2.异常的捕获

 异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。

 异常声明throws:

public class Config {
    File file;
    public void OpenFile(String name)throws FileNotFoundException{
        if(name.equals("abc")){
            throw new FileNotFoundException("文件名出错");
        }
    }
}

也就是在方法的后面写上:throws+xxxException 。

FileNotFoundException : 编译时异常,

表明文件不存在 此处不处理,也没有能力处理,应该将错误信息报告给调用者,让调用者检查文件名字是否给错误了。

(如果在main方法也不想画红线,在main方法后面也throws就好了,但是都没有处理这个异常,这时候就会交给JVM处理,JVM的处理方法就是直接崩溃!!!)

方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

try-catch处理

我们可以发现throws根本没有实际上解决异常,它只是让程序不报错,或者交给别人或者JVM处理,那我们怎么才能真正的处理这个异常呢?这时候就用到我们的try-catch了 。

public static void main(String[] args) {
        try {
            int[] arr = null;
            getElement(arr, 3);
            System.out.println("哈哈");
        } catch (NullPointerException e){
            System.out.println("处理这个异常");
            
            //打印一下在哪里出错了
            e.printStackTrace();
            System.out.println("处理完成");
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("发现异常");
            e.printStackTrace();
        }
        System.out.println("你好");
    }

1.try捕捉到异常后,不执行在try中这个异常后面的程序,所以不打印”哈哈“。

2.明明我的e.printStackTrace()在sout("处理完成")的后面,为什么顺序却反了呢?

答:为什么会出现程序输出偏差呢,先打印sout再打印异常,sout和异常打印不是同个打印,他们存在打印的偏差 不用理会,打印得出来就好了

3.main方法后面的程序继续执行,所以会打印”你好“。(什么时候不会打印呢?交给JVM的时候)如下:

四、finally 

所以引出我们的finaly:不管捕没捕到,都要执行 

    public static void main6(String[] args) {
        //若无法匹配到异常,就交给JVM,让JVM来判断
        try {
            int[] array = {1,2,3};
            System.out.println(array[3]); // 此处会抛出数组越界异常
        }catch (NullPointerException e){ // 捕获时候捕获的是空指针异常--真正的异常无法被捕获到
            e.printStackTrace();
        }finally{
            System.out.println("哈哈");
        }
        //若交给JVM判断的话,JVM收到后中断程序,接下来的代码也不会执行(除了finally)
        System.out.println("后序代码");
    }

在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库 连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

finally一定会被执行吗? 

  1. 当在try块中遇到System.exit()方法时,程序会立即退出,finally块中的代码不会被执行。

  2. 当在try块中遇到无限循环或者死循环时,finally块中的代码不会被执行。

  3. 当在try块中遇到未捕获的异常或Error时,程序会直接跳转到异常处理代码,finally块中的代码不会被执行。

五、throw和throws区别

throw用于主动抛出异常,throws用于声明方法可能抛出的异常类型。

throw是在方法体内部使用的,而throws是在方法的声明处使用的。 

六、异常处理的流程

 【异常处理流程总结】

1.程序先执行 try 中的代码

2.如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.

3.如果找到匹配的异常类型, 就会执行 catch 中的代码

4.如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.

5.无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).

6.如果上层调用者也没有处理的了异常, 就继续向上传递.

7.一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.

七、自定义异常

Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我 们实际情况的异常结构 。

具体方法如下:

1. 自定义异常类,然后继承自Exception 或者 RunTimeException

2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

package demo2;
//Login.java
//自定义
public class Login {
    public String username="admin";
    public String password="123456";

    public void loginInfo(String username, String password) {
        if (!this.username.equals(username)) {
            throw new UserNameException("用户名不匹配");
        }
        if (!this.password.equals(password)) {
            throw new PassWordException("密码不匹配");
        }
        System.out.println("登录成功");
    }

    public static void main(String[] args) {
        try {
            Login login=new Login();
            login.loginInfo("admin","12456");
        }catch (UserNameException e){
            e.printStackTrace();
        }catch (PassWordException e){
            e.printStackTrace();
        }

    }
}



package demo2;
public class PassWordException extends RuntimeException{
    public PassWordException(){

    }public PassWordException(String s){
        super(s);
    }
}



package demo2;
public class UserNameException extends RuntimeException{
    public UserNameException(){

    }
    public UserNameException(String s){
        super(s);
    }
}

注意事项:

自定义异常通常会继承自 Exception 或者 RuntimeException

继承自 Exception 的异常默认是受查异常

继承自 RuntimeException 的异常默认是非受查异常 

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

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

相关文章

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

ESP8266 接入阿里云物联网云平台

AT指令集参考资料 乐鑫科技&#xff1a;基础 AT 命令集 概念浅析 物模型 是对设备在云端的功能描述&#xff0c;包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型&#xff0c;称之为TSL&#xff08;即 Thing Specification Language&#xff0…

【学习笔记】3D-2D:PnP

主要解决什么问题&#xff1f; 主要解决的是已知空间中N个3D点及其图像中的2D点坐标&#xff0c;求相机在空间中的位置与姿态 求解PnP问题最少需要几个点&#xff1f; 最少只需要3个点对 求解PnP问题的常用方法 主要有用3对点估计位姿的P3P&#xff0c;另外还有DLT&#x…

前端如何学会全栈分页开发?源码和思路都在这了

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 前言 这是博客系…

商标注册申请名称的概率,多想名称选通过率好的!

近日给深圳客户申请的商标初审下来了&#xff0c;两个类别都下的初审&#xff0c;和当初的判断基本一致&#xff0c;普推知产老杨当时沟通说需要做担保申请注册也可以&#xff0c;后面选择了管家注册&#xff0c;最近大量的帮客户检索商标名称&#xff0c;分享下经验。 两个字基…

STM32H7系统窗口看门狗 (WWDG)应用方法介绍

目录 概述 1 认识窗口看门狗 (WWDG) 1.1 窗口看门狗定义 1.2 WWDG 主要特性 2 WWDG 功能说明 2.1 WWDG框图 2.2 WWDG 内部信号 2.3 控制递减计数器 2.4 看门狗中断高级特性 2.5 如何设置看门狗超时 3 WWDG 寄存器 3.1 控制寄存器 (WWDG_CR) 3.2 配置寄存器 (W…

如何调用通义千问大模型API

目录 登录阿里云 大模型服务平台百炼 登录控制台 QWen Long QWen 通义千问开源系列 大语言模型 OpenAI接口兼容 登录阿里云 阿里云-计算&#xff0c;为了无法计算的价值 大模型服务平台百炼 降价信息&#xff1a; 登录控制台 右上角取得API key 创建Key QWen Long qw…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言&#xff1a;有时候远程服务器的进程你想偷偷去围观一下有哪些&#xff0c;或者对一些比较调皮的进程进行封杀&#xff0c;或者对一些自己研发的服务进行远程手动启动或者重启等&#xff0c;又不想打开远程桌面&#xff0c;只想悄咪咪地执行&#xff0c;那也许下面的文章会…

关于解决Qt在安装的时候没有勾选sources组件的方法

关于解决Qt在安装的时候没有勾选sources组件的方法 一、引言 在安装数据库连接到qt的时候发现没有sources文件夹&#xff0c;原来是安装的时候没有勾选sources组件&#xff0c;发现问题后找到了维护qt组件的安装方式&#xff0c;特此记下来 二、分析原因 首先在安装的时候就…

Lookin高效调试iOS App的UI

Lookin是一款iOS开发时常用的调试软件&#xff0c;由腾讯微信读书团队QMUI开发。 它可以查看和修改iOS App里的UI对象的软件&#xff0c;展示App UI图层&#xff0c;类似于Xcode自带的UI Inspector工具&#xff0c;或另一款叫做Reveal的软件。 此外&#xff0c;虽然Lookin主体…

【C++语言】继承:类特性的扩展,重要的类复用!

【C语言】继承&#xff0c;更进一步的复用 ✨精美思维导图奉上继承1. 继承的相关概念&#xff1a;2. 继承的定义&#xff1a;&#xff08;1&#xff09;定义格式&#xff1a;&#xff08;2&#xff09;访问限定符和继承方式&#xff1a;&#xff08;3&#xff09;默认继承方式&…

C++_C++11的学习

1. 统一的列表初始化 1.1&#xff5b;&#xff5d;初始化 在C98 中&#xff0c;标准就已经允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。而到了C11&#xff0c;标准扩大了用大括号括起的列表 ( 初始化列表 )的使用范围&#xff0c;使其能适用于所有的内…

最大连续1的个数(滑动窗口)

算法原理&#xff1a; 这道题大眼一看是关于翻转多少个0的问题&#xff0c;但是&#xff0c;如果你按照这种思维去做题&#xff0c;肯定不容易。所以我们要换一种思维去做&#xff0c;这种思维不是一下就能想到的&#xff0c;所以想不到也情有可原。 题目是&#xff1a;给定一…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

linux centos nginx配置浏览器访问后端(tomcat日志)

1、配置nginx访问tomcat日志路径 vim /usr/local/nginx/conf/nginx,conflocation ^~ /logs {autoindex on;autoindex_exact_size on;autoindex_localtime on;alias /home/tomcat/apache-tomcat-9.0.89-1/logs;}###配置讲解### 1、location ^~ /logs { … }: location&#xf…

代码随想录——从前序与中序遍历序列构造二叉树(Leetcode105)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

构建智能化商场存包柜平台的数据结构设计

随着城市生活节奏的加快&#xff0c;人们对于便利的需求也越来越迫切。在城市中&#xff0c;商场存包柜平台成为了解决人们日常出行中行李存放问题的重要设施。为了更好地管理和运营这些存包柜&#xff0c;智能化商场存包柜平台的数据结构设计显得尤为关键。 一、需求分析与功能…

每日AIGC最新进展(12):在舞蹈视频生成中将节拍与视觉相融合、Text-to-3D综述、通过内容感知形状调整进行 3D 形状增强

Diffusion Models专栏文章汇总&#xff1a;入门与实战 Dance Any Beat: Blending Beats with Visuals in Dance Video Generation https://DabFusion.github.io 本文提出了一种名为DabFusion的新型舞蹈视频生成模型&#xff0c;该模型能够根据给定的静态图像和音乐直接生成舞蹈…

韩顺平0基础学Java——第11天

p234-249 又一个月了&#xff0c;时间过得好快啊&#xff0c;希望支棱起来 可变参数 public int sum(int ... nums){ } 这个nums是数组 细节&#xff1a; 1可变参数可以为0个&#xff0c;或任意个 2可变参数的实参可以为数组 3可变参数的本质就是数组 4可变参数可以和普通…

MicroLED:苹果对知识产权的影响

Yole的洞察揭示&#xff0c;MicroLED IP在经历了七年的爆炸式增长后&#xff0c;已然屹立于行业之巅。苹果公司&#xff0c;作为微LED领域的先行者&#xff0c;早在2014年便敏锐地捕捉到Luxvue这家初创公司的潜力&#xff0c;将其纳入麾下&#xff0c;引发了业界的广泛关注。然…