Java---认识异常

news2024/11/26 7:34:32

欢迎大家来观看本博课------Java------认识异常。1.异常的概念和体系结构

1.异常的概念和体系结构 

1.1 异常的概念

在Java中,在程序执行过程中发生的不正常行为称为异常。如在之前我们经常遇到的算数异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)和空指针异常(NullPointerException )。

1.2 异常的体系结构

在Java中,异常是一种类。由于异常的种类太多了,为了对异常和错误进行很好的分类管理,Java内部维护了一个异常的体系结构。

如下图

从上图可以看出异常的种类众多

1. Throwable位于最高层,是所有异常和错误的父类,派生出了Exception和Error两个子类。

2. Error是指Java虚拟机无法解决的严重问题。

3. Exception是指程序在发生不正常行为后,程序员可以通过调整代码,是程序正常运行。

1.3 异常的分类

异常分为两种,分别为编译时异常和运行时异常。

1.编译时异常

编译时异常也被称为受检查异常。即程序没运行时,编译器就会划红线报异常。

以我们之前讲的克隆为例子

如上图,程序都还没运行,编译器就会划红线报异常了,这就是编译时异常。

2.运行时异常

 运行时异常也被称为不受查异常,即在程序运行之后才会出现的异常。

如以上代码,程序运行前没有出现任何异常,但是运行代码后,就会报出下图的异常。这就是所谓的运行时异常。 

2. 异常的处理

 在Java中,关于异常的处理我们要用带5个关键字,分别为throw,try,catch,finally和throws

1. 异常的抛出----throw

public class Test {
    private static void func(int a){
        if(a==0){
            throw new ArithmeticException();
        }
    }
    public static void main(String[] args) {
        func(0);
    }
}

运行以上代码

public class Test {
    private static void func(int a){
        if(a==0){
            throw new ArithmeticException("a==0");
        }
    }
    public static void main(String[] args) {
        func(0);
    }
}

 以上个代码的区别在哪呢?就是一个抛出的异常传了参数,一个没有传参数。

这个传递的字符串通常是产生异常的原因。如果传来参数,运行的时候,字符串也会显示出来。

【注意事项】

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

2.throw抛出的异常需要是Exception类或者是Exception的子类。

3.如果throw抛出的异常是运行时异常,可以不写,最后交给JVM来处理。

4.如果throw抛出的是编译时异常,则程序员必须处理,否则程序无法运行。

5.throw一但抛出,后续代码将不会运行。

6.throw抛出的一般是自定义异常。(软性要求)

2.异常的捕获

异常的捕获,也就是异常的处理方式。通常是异常声明---throws关键字和异常捕获try-catch两种。

1.异常声明---throws关键字

异常申明一般处于方法的参数列表的后面,如果程序不想亲自解决该方法声明的异常,我们可以将该异常抛给方法的调用者来处理。即当前的方法不处理异常,让方法的调用来处理异常

以之前实现对象的克隆为例子:

之前我们实现克隆的时候为什么到这一步还会保错呢?

因为我们在调用clone这个方法的时候,这个clone方法声明了一个异常,需要该方法的调用者来处理这个异常。明显是在main方法中调用了该clone方法,所以main方法要来处理这个异常。处理方式就是也在方法的调用者的方法参数列表后面在声明一次该异常就行了。

如下图

【注意事项】

1.throws的异常声明只能写在函数参数列表的后面。

2.throws声明的异常必须是Exception类或者Exception的子类。

3.如果方法内部抛出了多个异常,throws后面就得写多个异常,中间用逗号隔开。如果异常的类型之间存在父子类的关系,则只声明也可以。  

2.异常的捕获并处理----try{...}catch(...){...}

throws声明的异常并没有对异常进行真正的处理,如果想真正得对异常进行处理,需要用到try和catch关键字。

语法格式

try{
   ...
}catch(){
   ...
}

代码演示

public static void func(){
     int[] arr={1,2,3};
        System.out.println(arr[4]);
    }
    public static void main(String[] args) {
        try{
            func();
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获数组越界异常");
            e.printStackTrace();
        }

    }

从上面代码,我们知道func()方法里面出现了数组越界的异常,我们将出现异常的代码放在try的代码块里面,接着在catch的括号里面写上对应出现的异常。

【注意事项】

1.try...catch中可以根多种异常,知道与catch后的异常类型匹配为止。

public static void func(){
     int[] arr={1,2,3};
        System.out.println(arr[4]);
    }
    public static void main(String[] args) {
        try{
            func();
        }catch (NullPointerException e){
            System.out.println("捕获了空指针异常");
            e.printStackTrace();
        }catch (ArithmeticException e){
            System.out.println("捕获了算术异常");
            e.printStackTrace();
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获数组越界异常");
            e.printStackTrace();
        }
    }

如上面的代码,虽然也写了catch很多异常,但是抛出的异常是数组越界异常,所以只会执行与数组越界异常匹配的catch语句。

 2.如果try里面的代码块里的代码出现了异常,那么try代码块就不会执行出现异常代码之后的代码但如果try代码块里面不出现异常,则try代码块里面的所有代码都会执行。

public static void func(){
     int[] arr={1,2,3};
        System.out.println(arr[4]);
    }
    public static void main(String[] args) {
        try{
            func();
            System.out.println("func()后面的代码");
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获数组越界异常");
            e.printStackTrace();
        }
    }

由于func()抛出了异常,所以就不会执行try代码块里面func()后面的代码。

3. 只有捕捉到了异常,catch代码块里面的的代码才会运行。

public static void main(String[] args) {
        try{
            int n=10;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获数组越界异常");
            e.printStackTrace();
        }
    }

 由于try代码快里面的代码没有出现异常,则catch就没有捕获异常,则catch代码快里面的代码就不会运行。

4.如果try代码块里面抛出了多个异常,只会捕捉一个异常,因为当捕捉了一个代码之后,代码就会终止了。

3.finally关键字

在程序运行的时候,会有一些特定的代码,不管程序是否抛出异常,都需要执行。比如程序资源的打开:网络连接、数据库连接和IO流。在程序正常运行或者出现异常时,必须实现对资源的关闭,否则会造成内存泄漏。另外,可能因为程序抛出异常,会导致一些代码执行不了。这时候就要用到finally关键字。因为finally代码块里面不管前面的代码是否抛出异常,finally代码块里面的代码都会执行。

1. 程序抛出异常

public static void main(String[] args) {
        int[] arr={1,2,3};
        try{
            arr[4]=0;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获到数组越界异常");
        }finally {
            System.out.println("finally代码块运行");
        }
    }

运行代码 

 2. 程序不抛出异常

public static void main(String[] args) {
        int[] arr={1,2,3};
        try{
            arr[2]=0;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获到数组越界异常");
        }finally {
            System.out.println("finally代码块运行");
        }
    }

 3. 易错点

public static int func(){
        try{
            return 20;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获到数组越界异常");
        }finally {
            return 100;
        }
    }
    public static void main(String[] args) {
       int data= func();
        System.out.println(data);//打印100
    }

之所以最后的结果是100,我们可以理解为因为finally代码块终究会执行,所以程序就会只执行finally代码块里面的return语句。 

 4. 异常处理总结

首先会执行try代码块里面的代码,看其是否抛出异常。如果抛出异常,就会看catch代码块有没有匹配的异常,如果catch边没有找到对应的异常,就会交给上层调用者去处理。如果上层调用者也没有处理异常,则会交给main方法处理,如果main方法也没有处理,则最后就会交给JVM去处理。

3.自定义异常类

虽然在Java中,异常的种类也很丰富了,但终会有一些异常在Java中是没有定义的,所以我们要学会自定义异常类。

1. 自定义异常一般都会继承Exception类或者RunTimeException类。

2. 继承Exception类是受检查类。

3. 继承RunTimeException类是不受检查类。

实现登录异常

自定义NameExcetion类继承Exception

public class NameException extends Exception{
    public NameException() {
        super();
    }

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

自定义Password类继承RuntimeException

public class PasswordException extends RuntimeException{
    public PasswordException() {
        super();
    }

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

主函数

class Login {
    public String password;
    public String name;

    public Login(String password, String name) {
        this.password = password;
        this.name = name;
    }
    public  void login(String password,String name)throws PasswordException,NameException{
        if(!this.password.equals(password)){
            throw new PasswordException("密码错误");
        }if(!this.name.equals(name)){
                throw new NameException("用户名错误");
            }
        System.out.println("登录成功");
        }
}
public class Test {
    public static void main(String[] args) {
        Login login=new Login("123","man");
        try{
            login.login("123","man");
        }catch (PasswordException e){
            e.printStackTrace();
        }catch (NameException e){
            e.printStackTrace();
        }
    }
}

我们也可以在login函数处理继承Exception类抛出的异常。

class Login {
    public String password;
    public String name;

    public Login(String password, String name) {
        this.password = password;
        this.name = name;
    }
    public  void login(String password,String name){
        if(!this.password.equals(password)){
            throw new PasswordException("密码错误");
        }try {
            if(!this.name.equals(name)){
                throw new NameException("用户名错误");
            }
        }catch (NameException e){
            e.printStackTrace();
        }
        System.out.println("登录成功");
    }
}
public class Test {
    public static void main(String[] args) {
        Login login=new Login("123","man");
        try{
            login.login("123","man");
        }catch (PasswordException e){
            e.printStackTrace();
        }
    }
}

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

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

相关文章

金融行业的等保测评要求

在金融行业中,网络安全问题非常普遍,如恶意攻击、病毒感染、数据泄露等。这些问题可能会导致金融机构的信息系统瘫痪,造成巨大的经济损失,甚至影响国家金融稳定。因此,金融机构应该高度重视网络安全问题,采…

使用libpurple函数库接入服务器

代码; #define CUSTOM_USER_DIRECTORY "/dev/null" // 定义用户目录 #define CUSTOM_PLUGIN_PATH "" // 定义插件目录 #define PLUGIN_SAVE_PREF "/purple/nullclient/plugins/saved" // 定义插件头目录 #define UI_ID "nullc…

DELL服务器插入新磁盘、创建虚拟磁盘、挂载磁盘步骤

文章目录 一、磁盘清理(可选,针对新硬盘是Foreign状态)1、进入VD Mgmt2、清理新硬盘配置 二、创建虚拟磁盘1、进入Device Settings2、创建虚拟磁盘 三、挂载磁盘到系统1、分区磁盘(注意实际磁盘的名称)2、格式化分区3、…

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时,我们实际上是在讨论一种网络安全策略,旨在通过技术手段将网络划分为不同的区域或子网,每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…

微服务feign组件学习

手写不易,对您有帮助。麻烦一键三连。也欢饮各位大料指正,交流。 微服务feign组件学习 1.概念1.1 feign 概念1.2 Ribbon概念 2.使用2.1 集成feign2.1.1 maven依赖2.1.2 项目结构 2.2 使用2.2.1 定义feign接口2.2.2 消费端服务调用2.2.3 消费端扫描feig…

Java面试题汇总(持续更新.....)

Java面试题 1. JVM & JDK & JRE Java虚拟机(JVM)是运行Java字节码的虚拟机,JVM有针对不同系统的特定实现,目的是使用相同的字节码,他们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译、…

个人网站制作 Part 25 添加实时聊天功能 | Web开发项目添加页面缓存

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加实时聊天功能🔨使用聊天服务🔧步骤 1: 选择聊天服务🔧步骤 2: 安装Socket.io🔧步骤 3: 创建Socket.io服务器 &#x1…

抽奖系统源码_微信抽奖系统PHP源码开源

介绍: 微信抽奖系统源码是一个以php MySQL进行开发的手机抽奖系统源码。用途:适合做推广营销、直播、粉丝抽奖。 功能介绍: 1、后台可以设置每个抽奖用户的抽奖次数,后台添加设置奖品,适和企业和商场搞活动,后台添加用户,才能抽…

如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法

本文将探讨了缺失值插补的不同方法,并比较了它们在复原数据真实分布方面的效果,处理插补是一个不确定性的问题,尤其是在样本量较小或数据复杂性高时的挑战,应选择能够适应数据分布变化并准确插补缺失值的方法。 我们假设存在一个…

【多线程】Thread类及其基本用法

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. Java中多线程编程1.1 操作系统线程与Java线程1.2 简单使用多线程1.2.1 初步创建新线程代码1.2.2 理解每个…

小功率无变压器电源设计

采用无变压器电源解决方案为低功率电路提供所需电源通常是有利的。 事实上,如果负载电流只有几十毫安,则可以将输入交流电压转换为直流电压,而无需使用大型、昂贵且笨重的变压器。不带变压器的替代方案也更便宜、更轻并且占地面积更小。无变…

深入剖析人才管理的关键要素:“选、用、育、留”四大核心要素

在当今这个日新月异的商业时代,企业的成功不再仅仅取决于资金、技术或市场策略,而更多地依赖于企业所拥有的人才资源。有效的人才管理策略,尤其是“选、用、育、留”四大核心要素,已成为推动企业持续发展的关键。 一、选&#xff…

28.启动与暂停程序

上一个内容:27.设计注入功能界面 以它 27.设计注入功能界面 的代码为基础进行修改 点击添加游戏按钮之后就把游戏启动了 CWndINJ.cpp文件中修改: void CWndINJ::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码/*ExeLst.InsertItem(0, L…

虚函数机制-动态绑定的应用

虚函数使得程序在运行的时候根据指针指向对象的类型来确定调用哪个函数。 下图中:都为静态绑定。因为在编译器就确定了可以调用的函数 此时当基类指针指向派生类对象时,因为没有virtual关键字,所以在编译阶段就根据指针类型确定了要指向的函…

博客论坛系统java博客管理系统基于springboot+vue的前后端分离博客论坛系统

文章目录 博客论坛系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 博客论坛系统 一、项目演示 博客论坛系统 二、项目介绍 基于springbootvue的前后端分离博客论坛系统 系统角色&#xff1a…

创业者的孤独之旅:马云视角下的战略定位与自我激励

一、引言 在创业的道路上,每一位创业者都如同孤独的旅人,背负着梦想与希望,踏上了充满未知与挑战的征途。马云,这位中国电子商务的巨擘,以其独特的视角和坚韧不拔的精神,为我们揭示了创业者所面临的孤独与…

js注册popstate事件并阻止浏览器返回

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、第一步二、第二步三、第三步四、最后 前言 在做一些重要资料填写的时候, 我们基本都会阻止一下浏览器的回退, 刷新等等, 今天我们主要针对回退, 做一次讲解。 提示:以下是本篇文章正文内容&#…

HCIP认证笔记(填空)

1、为防止攻击者伪造BGP报文对设备进行攻击,可以通过配置GTSM功能检测IP报文中的TTL值的范围来对设备进行保护。如果某台设备配置了“peer x.x.x.x valid-ttl-hops 100",则被检测的报文的TTL值的有效范围为【(156),255】; 解析: peer {group-name | ipv4-address…

2024年7款硬盘恢复软件:即刻恢复硬盘删除的文件!

当文件被删除后,它并不是立即从硬盘中消失,而是被标记为“已删除”,等待垃圾回收处理。因此,在文件被删除后,有几种方法可以尝试恢复删除的数据。 以下是7款常用的数据恢复软件,以及它们的详细介绍&#xf…

IDEA创建SpringBoot项目教程,讲解超详细!!!(2024)

前言 在创建Spring Boot项目时,为了确保项目的顺利构建和运行,我们依赖于JDK(Java开发工具包)和Maven仓库。 JDK作为Java编程的基础,提供了编译和运行Java应用程序所需的核心类库和工具。 JDK安装配置教程&#xff1…