Java的异常Exception

news2024/11/18 17:37:52

异常

1、异常概述与异常体系结构

1.1、异常概述

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)

Java程序在执行过程中所发生的异常事件可分为两类:

  • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverFlowError和OutOfMemory。一半不编写针对性的代码进行处理。
  • Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如:
    • 空指针访问
    • 试图图区不存在的文件
    • 网络连接中断
    • 数组角标越界

KNY_~B0DP`T5LP2X3_C7PNU.png

编译时异常:执行javac.exe命令时,可能出现的异常

运行时异常 :执行java.exe命令时,出现的异常

1.2、异常体系结构

java.lang.Throwable
        |-----java.lang.Error: 一半不编写针对性的代码进行处理
        |-----java.lang.Exception: 可以进行异常的处理
            |------编译时异常(checked)
                    |-----IOException
                        |-----FileNotFoundException
                    |-----ClassNotFindException
            |------运行时异常(unchecked, RuntimeException)
                    |-----NullPointerException
                    |-----ArrayIndexOutOfBoundsException
                    |-----ClassCastException
                    |-----InputMismatchException
                    |-----NumberFormatException
                    |-----ArithmeticException

关于异常的举例:

见 package cs20230321.java1;

//--------以下是编译时异常----------------
//IOException
public void test7() {
    File file = new File("hello.txt");
    FileInputStream fis = new FileInputStream(file);

    int data = fis.read();
    while (data != -1){
        System.out.println((char) data);
        data = fis.read();
    }
    fis.close();//流资源需要显式的有关闭操作
}

//--------以下是运行时异常----------------
//ArithmeticException
public void test6(){
    int a = 10;
    int b = 0;
    System.out.println(a/b);//不符合算法的要求
}

//InputMismatchException
public void test5(){
    Scanner scanner = new Scanner(System.in);
    int score = scanner.nextInt();//当输入不是数字时会报异常
    System.out.println(score);
}

//NumberFormatException
public void test4(){
    String str4 = "123zxc";
    int n4 = Integer.parseInt(str4);
    System.out.println(n4);
}
//ClassCastException
public void test3(){
    Object o= new Date();//多态
    String  str3 = (String) o;//转为Object的子类
}
public void test1(){
    //NullPointerException 1
    int[] arr = null;
    System.out.println(arr[3]);
    //NullPointerException 2
    String str = "abc";
    str = null;//对象是空的,所以空指针异常
    System.out.println(str.charAt(0));//获取首位置上的字符
}

//ArrayIndexOutOfBoundsException
public void test2(){
    int[] arr1 = new int[10];
    System.out.println(arr1[10]);

    String str = "abc";
    //StringIndexOutOfBoundsException
    System.out.println(str.charAt(3));//获取首位置上的字符
}

2、异常处理

联系 “ 狼来了”

异常的处理:抓抛模型

  • 过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。
    —旦抛出对象以后,其后的代码就不再执行。

    关于异常对象的产生:

    1. 系统自动生成的异常对象
    2. 手动的生成一个异常对象,并抛出(throw)
  • 过程二:“抓”:可以理解为异常的处理方式:① try-catch-finallythrows

2.1、try-catch-finally

格式:

try{
    //可能出现异常的代码
        }catch(异常类型1 变量名1){
            //处理异常的方式 1
        }catch(异常类型2 变量名2){
        //处理异常的方式 2
        }catch(异常类型3 变量名3){
        //处理异常的方式 3
        }
        ...
        finally{
            //一定会执行的代码
        }

说明:

  1. finally是可选的

  2. 使用try将可能出现异常的代码包起来,在执行过程中,一旦出现异常,就会生成应该对应异常类的对象,根据此对象的类型,去catch中进行匹配

  3. 一旦try中的异常对象匹配到某一个cacth时,就进入catch中进行异常的处理一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码

  4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。

    catch中的异常类型如果有子父类关系,则要求子类一定声明在父类的上面,否则,报错

  5. 常用的异常对象处理的方式:① String getMessage() ② printStackTrace();

  6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用

  7. try-catch-finally结构可以相互嵌套

体会1:使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

体会2 :开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,我们说一定要考虑异常的处理。

2.1.1、finally

  1. finally是可选的
  2. finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch 中有 return 语句等情况。
  3. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

2.1.2、面试题(待完善)

  • throw和 throws的区别?

throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。

throws属于处理异常的一种方式,声明在方法的声明处。

  • final 、finally、finalize三者的区别?

final:关键字,修饰属性、方法

finally:关键字,用于处理异常时

finalize:方法名

还有其他类似的。如:

  • Collection、 Collections
  • String、 StringBuffer、 StringBuilder
  • ArrayList、 LinkedList
  • HashMap、 LinkedHashMap
  • 重写 、重载

结构不相似的:

  • 抽象类、接口
  • ==、equals()
  • sleep() 、wait()

2.2、throws + 异常类型

  1. “throws + 异常类型 ” 写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦方法体执行时,出现异常,扔会在代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行。

体会:

  • try-catch-finall :真正的将异常给处理调了。
  • throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

开发中,如何选择使用 try-catch-finall 还是 throws ?

  1. 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finall 方式处理。
  2. 执行的方法 a 中,先后 又调用了另外的几个方法,这几个方法是递进关系执行的,我们建议使用throws的方式进行处理。而执行的方法 a 可以考虑使用try-catch-finall 方式进行处理。

2.3、方法重写的规则

  1. 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

2.4、手动的生成一个有异常对象

在方法中 throw new Exception,然后再 e.getMessage() 获取message

package cs20230322;

public class StudentTest {
    public static void main(String[] args) {
        try {
            Student s = new Student();
            s.regist(-1001);
            System.out.println(s);
        }catch (Exception e){
            System.out.println(e.getMessage());//message传的就是 "您输入的数据非法!"
        }
    }
}

class Student{
    public int id;
    public void regist(int id) throws Exception {
        if (id > 0){
            this.id = id;
        }else {
            //手动生成异常
            //在方法内,生成一个异常对象
            throw new Exception("您输入的数据非法!");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                '}';
    }
}

2.5、如何自定义异常类?

步骤:

  1. 继承于现有的异常结构:RuntimeException、Exception
  2. 提供全局常量:serialVersionUID
  3. 提供重载的构造器

2.6、总结

1679477597470.png

上游排污:污:异常,是throw排出来的污水(制造污水)

下游治污:处理异常,处理的方案是直接往上面报,并没有真正的处理掉异常(治理污水)

image.png

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

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

相关文章

装饰器模式:通过剖析Java IO类库源码学习装饰器模式

我们通过剖析Java IO类的设计思想,再学习一种新的结构型模式,装饰器模式。它的代码结构跟桥接模式非常相似,不过,要解决的问题却大不相同。 Java IO类库非常庞大和复杂,有几十个类,负责IO数据的读取…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一:通过程序路径指定应用程序,例如指定写字板程序路径。1.2示例二:通过程序ID指定应用程序,例如指定计算器ID。1.3 应用程序ID&#xff0…

芯片工程师求职题目之验证篇(2)

1. 事件驱动的仿真器和和基于周期的仿真器有什么区别? 事件驱动的仿真器顾名思义就是根据事件(event)触发仿真进行的,在进入一个周期中,它会获取每个事件并通过设计传播求值,直到达到稳定状态的条件,接着进入下一个周…

Android:安卓开发采用Volley网络框架+MySQL数据库,实现从服务器获取数据并展示完成记单词APP

一、功能与要求 实现功能:设计一个记单词APP。服务器采用Tomcat,数据库采用Mysql。实现用户的注册登录功能以及单词的增删改查。 指标要求:实现UI布局;将系统数据保存到Mysql数据库中,并采用Volley网络框架实现从服务…

【机器学习核心总结】什么是随机森林

什么是随机森林 森林里有很多树,随机森林里有很多决策树。 随机森林是决策树的升级版,随机指的是树的生长过程。世上没有两片相同的树叶,随机森林中的树也各不相同。在构建决策树时,我们会从训练数据中有放回的随机选取一部分样本…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面,让用户可以访问 负载均衡策略: Service 的类型: 案例:Service服务发布案例 扩展:我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件: 创建Pod&…

ChatGLM2-6B发布,C-Eval超GPT4,支持32k上下文!

自清华大学数据挖掘实验室(THUDM)3月开源ChatGLM-6B已经过去了3个多月,最近他们又带来了性能全面提升的“船新”版本-ChatGLM2-6B。别看名字变化小,其实更新的模型性能是又有量又实用。不了解ChatGLM的小伙伴可以看我这篇文章&…

Java基础之五 反射

通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。 通过反射可以访问的主要描述信息 访问成员变量 常用方法:getFields()、getField(String name)、getDeclaredFields()…

第 353 场LeetCode周赛

A 找出最大的可达成数字 签到题 class Solution { public:int theMaximumAchievableX(int num, int t) {return numt*2;} };B 达到末尾下标所需的最大跳跃次数 动态规划: 定义 p i p_i pi​为跳至 i i i处所需的最大跳跃次数, 有状态转移方程 p i m a x { p j 1 ∣ 0 ≤ j &…

文档管理:PaperPort Professional 14.7 Crack

文档管理变得简单 PaperPort Professional 快速、轻松地访问重要文档对于保持组织平稳运行至关重要。与其浪费时间在文件夹中搜索所需的文件,不如在PC上扫描,转换,组织,组装和共享文档和图像,或者更好的是,…

vue对于数组的数据监听变化和object是不一样的吗?

我们知道vue对于数组的数据监听变化和object是不一样的,因为我们常说的Object.defineProperty是对象上面的方法,所以对于array数组需要实现另外一套变化侦测机制。 今天我们就来研究下。 在哪里收集依赖 array数据设计了新的变化侦测机制,…

阿里云服务器架构X86计算、ARM、GPU/FPGA、裸金属和超级计算集群

阿里云服务器架构有什么区别?X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别?阿里云服务器网分享云服务器ECS架构详细说明: 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

第八章:L2JMobius学习 – 游戏服务GameServer讲解

本章节我们来讲解GameServer服务,首先来查看它的文件结构 ai:游戏角色自动化处理,比如说,自动攻击。 cache:数据缓存,里面就一个HtmCache.java类,缓存HTML文件内容。 communitybbs:b…

【C语言】1-Visual C++ 2010 的简单使用和第一个 C 语言程序

1. Visual C++ 2010 的简单使用 1.1 面板介绍 1.2 新建C语言项目 打开 Visual C++ 2010,点击 New Project 根据下面的图示进行操作,其中需要注意 ③:这里输入的为项目名(建议和我的命名保持一致) ④:这里是项目存放的位置,可以自己选择,最好不要有中文路径(只要是使…

苹果用户要留意?女子FaceTime通话面临巨额骗局,损失高达160万

FaceTime通话是苹果提供的一项服务,可以让使用iOS、iPadOS设备或Mac电脑的用户进行视频或音频通话。只要知道对方的Apple ID,世界各地的苹果设备都可以通过该ID进行呼叫。 据报道,一名居住在上海金山的女性最近遭受了一种新型诈骗&#xff0c…

js逆向补环境-调试工具vscode与nodejs使用之无环境联调

目录 一、啊哈一、Nodejs安装1、nodejs最新版本的安装(windows)2、旧版nodejs更新成最新版本(windows)3、nodejs安装(linux) 二、vscode安装使用(windows)1、下载安装vscode2、vscode运行插件Code Runner安…

多元分类预测 | Matlab基于K近邻算法(KNN)的数据分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于K近邻算法(KNN)的数据分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部分源码

MAYA粒子爆炸

创建粒子替代 中心归零 只有一种石头 particleShape1.shitourand(0,5); 设置石头大小 等比例变小 particleShape1.daxiao<<0.2,0.2,0.2>>; 使用变量代替 float $daxiaorand(0.2,0.5); particleShape1.daxiao<<$daxiao,$daxiao,$daxiao>>; 非等比例缩…

【国家标准】GB 7713-87 科学技术报告、学位论文和学术论文编写格式

目 录 1 引言 2 定义 2.1 科学技术报告 2.2 学位论文 2.3 学术论文 3 编写要求 4 编写格式 5 前置部分 5.1 封面 5.2 封二 5.3 题名页 5.4 变异本 5.5 题名 5.6 序或前言 5.7 摘要 5.8 关键词 5.9 目次页 6 主体部分 6.1 格式 6.2 序号 6.3 引言(或绪论)…