Java SE(十一)之异常处理(Exception)

news2024/11/25 10:34:44

文章目录

  • 异常概述
    • 1.什么是异常?
    • 2.为什么要异常?
  • 异常体系及分类
    • 1.运行时异常
    • 2.编译时异常
  • 异常处理
    • 1.JVM默认处理方案
    • 2.try…catch…
    • 3.throw & throws
      • (1)抛出异常throw
      • (2)声明异常throws
      • (3)throw和throws比较
  • 自定义异常
    • 1.自定义编译时异常
    • 2.自定义运行时异常
  • 异常的使用规则

异常概述

1.什么是异常?

异常是程序在“编译”或者“执行”的过程中可能出现的问题,(语法错误不算在异常体系中)
比如:数组索引越界、空指针异常、 日期格式化异常,等…

2.为什么要异常?

如果没有异常会怎么样?

  • 无法穷举所有异常情况
  • 错误处理代码和业务实现代码混杂
  • 代码量增加

所以:
1.异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止.
2.避免异常,然后提前处理异常,体现的是程序的安全, 健壮性

异常处理机制:当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序

异常体系及分类

异常体系如下图:

在这里插入图片描述

Error:
系统级别问题、JVM退出等,代码无法控制

Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题

  • RuntimeException及其子类:运行时异常,编译阶段不会报错。 (空指针异常,数组索引越界异常) ——程序员的主要关注点
  • 除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。

Throwable常用方法(一般用来返回异常信息):

在这里插入图片描述

1.运行时异常

直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误

常见运行时异常:

  • 数组索引越界异常:ArraylndexOutOfBoundsException
  • 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
  • 数学操作异常:ArithmeticException
  • 类型转换异常:ClassCastException
  • 数字转换异常: NumberFormatException

(一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误)

2.编译时异常

不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过

一般遇到情况 比较少,直接举个例子:

在这里插入图片描述

异常处理

1.JVM默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理

  • 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行

缺点:直接从当前执行的异常点干掉当前程序。后续代码没有机会执行了,因为程序已经死亡

2.try…catch…

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。

格式:

try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}

执行流程:

1.程序从try里面的代码开始执行

2.出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统

3.当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理执行完毕之后,程序还可以继续往下执行

3.throw & throws

(1)抛出异常throw

很多时候,在当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者

具体操作:

  1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。

  2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象。

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。语法:

throw new 异常类名(参数);

e.g.

public class ThrowDemo {
    public static void main(String[] args) {
        //创建一个数组 
        int[] arr = {2,4,52,2};
        //根据索引找对应的元素 
        int index = 4;
        int element = getElement(arr, index);

        System.out.println(element);
        System.out.println("over");
    }
    /*根据 索引找到数组中对应的元素*/
    public static int getElement(int[] arr,int index){ 
       	//判断  索引是否越界
        if(index<0 || index>arr.length-1){
             /*
             判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
             这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。 
              */
             throw new ArrayIndexOutOfBoundsException("角标越界了```");
        }
        int element = arr[index];
        return element;
    }
}

注意主程序在getElement处异常就停止了,不会再输出后面的over语句。

(2)声明异常throws

关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

抛出异常格式:

1.方法 throws 异常1,异常2,异常3 …{ }
2.方法 throws Exception{ }

(3)throw和throws比较

在这里插入图片描述

自定义异常

因为Java无法为这个世界上全部的问题提供异常类,所以某些时刻需要自定义异常

1.自定义编译时异常

定义一个异常类继承Exception.
重写构造器。
在出现异常的地方用throw new 自定义对象抛出

作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!

2.自定义运行时异常

定义一个异常类继承RuntimeException.
重写构造器。
在出现异常的地方用throw new 自定义对象抛出!

作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

在这里插入图片描述

异常的使用规则

1.不要过度使用异常

  • 把异常和错误混淆在一起,不编写任何错误处理代码,而是简单地抛出异常来代替所有错误处理
  • 使用异常处理来代替流程控制

2.不要使用过于庞大的try块
try块过于庞大,难免后面会跟大量的catch块,此时需要分析他们之间的逻辑关系,反而导致了编程复杂度的增加

3.尽量提供对每个最小异常的处理
若每个异常都采用相同的处理方式,会导致无法对不通过异常分情况处理,以跟踪错误发生的原因

4.不要忽略捕获到的异常
在合适的层处理异常

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

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

相关文章

Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

背景&#xff1a; 本文的内容是针对单片机蓝牙模块&#xff08;HC-42&#xff09;开发的手机App。在这之前&#xff0c;我想先声明一点&#xff0c;手机与手机间的蓝牙连接方式”与“手机与HC间的蓝牙连接方式”是不一样的。原因就是手机搭配的是“经典蓝牙”模块&#xff0c;…

HTML【前端基础】

目录 1.HTML 结构 1.1 HTML 标签 1.2 HTML 文件基本结构 1.3 标签层次结构 1.4 快速生成代码框架 2.HTML 常见标签 2.1 注释标签 2.2 标题标签: h1-h6 2.3 段落标签&#xff1a;p 2.4 换行标签: br 2.5 格式化标签 2.6 图片标签: img 2.7 超链接标签: a 2.8 表格…

Android Java 音频采集 AudioRecord

在 Android Java 应用中&#xff0c;一般用 AudioRecord 管理从平台的音频输入设备采集音频数据所需的资源。音频采集和音频播放密切关系&#xff0c;Android 系统中 Java AudioRecord 和 AudioTrack 在许多方面&#xff0c;都有着很高的相似性&#xff0c;无论是代码的目录组织…

java基础知识——25.异常

这篇文章&#xff0c;我们来讲一下java的异常体系 目录 1.异常概述 2 java的异常继承体系 2.1 编译时异常 2.2 运行时异常 2.3 底层原理 2.4 异常的作用 3.异常的处理方式 3.1 JVM默认的处理方式 3.2 自己处理&#xff08;捕获异常&#xff09; 3.2.1自己处理的4个问…

端到端NVMe?| NVMe-OF或FC-NVMe

声明 主页&#xff1a;元存储的博客_CSDN博客 依公开知识及经验整理&#xff0c;如有误请留言。 个人辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 内容摘要 前言 NVMe全称是Nonvolatile Memory Express&#xff08;非易失性内存标准&#xff09;&#xff0c;在它首次…

( 字符串) 647. 回文子串 ——【Leetcode每日一题】

❓647. 回文子串 难度&#xff1a;中等 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使…

JSP 的本质原理解析:“编写的时候是JSP,心里想解读的是 java 源码“

JSP 的本质原理解析&#xff1a;“编写的时候是JSP&#xff0c;心里想解读的是 java 源码” 文章目录 JSP 的本质原理解析&#xff1a;"编写的时候是JSP&#xff0c;心里想解读的是 java 源码"每博一文案1. JSP 概述2. 第一个 JSP 程序3. JSP 的本质就是 Servlet4. J…

appium的手动安装步骤教程及appium-doctor报错解决集合

前言 相信你不少软件测试行业小伙伴应该在用npm安装appium或者是cpm安装appium途中也碰到下面一些报错吧&#xff0c;接下来Darren洋教你改为手动安装appium吧&#xff01;整理不易&#xff0c;请点赞加关注后查看。 一、安装Node.js 下载地址&#xff1a; Previous Releases …

【五一创作】某头条参数破解并实现界面化搭建

某条参数破解并实现界面化搭建 前言效果展示难点参数逆向破解_signatureac_signatures_v_web_id 界面化实现总结 前言 趁着日常闲余时间&#xff0c;想着搞一搞某条的反爬&#xff0c;练练手&#xff0c;想到自己很久没开发过前端界面了&#xff0c;有点生疏&#xff0c;也趁此…

PCL学习二:PCL基础应用教程

参考引用 PCL Basic UsagePCL 点云库官网教程 1. pcl_viewer 基本使用 1.1 pcl_viewer 安装测试 pcl_data 源码克隆$ git clone https://github.com/PointCloudLibrary/data.git进入 /pcl_data/tutorials&#xff08;如下图&#xff09;$ cd ~/pcl_data/tutorials # 此处为重…

IDEA常用提升效率的操作小记

IDEA目前是使用最广泛的Java开发工具之一了&#xff0c;虽然是收费的&#xff0c;但是也提供了免费的社区版&#xff0c;并且收费版也支持使用github的开源项目&#xff0c;使用免费license&#xff0c;虽然每年都要续&#xff0c;我用的就是开源项目申请的免费license。 开发…

【Pytorch基础教程39】torch常用tensor处理函数

note 文章目录 note一、tensor的创建二、tensor的加减乘除三、torch.argmax()函数四、gathter函数小栗子1小栗子2&#xff1a;如果每行需要索引多个元素&#xff1a; 四、针对某一维度的操作五、改变维度、拼接、堆叠等操作Reference 一、tensor的创建 torch.tensor会复制data…

STM32配置ADC2(DMA)进行采集 DAC 输出-2

0.一定要先看上一节&#xff1a;STM32配置ADC2&#xff08;DMA&#xff09;进行采集 DAC 输出-2 1.实验目标 在上一节的基础上&#xff0c;我们把 DAC&#xff08;三角波&#xff09;给集成进来&#xff0c;实现按下按键输出三角波&#xff0c;通过串口发送数据给电脑&#x…

Apache Zeppelin系列教程第二篇——整体架构

Zeppelin 架构&#xff1a; 首先我们来了解下 Zeppelin的架构, Zeppelin 主要分3层。 Web前端 Zeppelin Server Interpreter Zeppelin前端负责前端页面的交互&#xff0c;通过Rest API 和WebSocket的方式与Zeppelin Server进行交互。 Zeppelin Server是一个Web server&…

【python 基础语法一】注释,变量与运算符

一、注释 注释: 就是对代码的解释&#xff0c;方便阅读&#xff0c;被注释的代码不执行 分类 单行注释 # 1.单行注释 以#号开头 &#xff0c;右边的所有东西都被当做说明文字 &#xff0c;程序不进行编译运行。 print(hello world)多行注释 # 2.多行注释 三个单引号 或…

Sentinel源码分析学习

文章目录 前言Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.ContextUtil 2.Proce…

django显示echart图表:柱状图、折线图、饼图、地图、词云

django显示echart图表 效果: 示例demo 点我查看 1、urls.py 其中关键代码: urlpatterns = [path("book_chart/", views.book_chart, name="book_cha

LINUX压缩和解压和磁盘管理与维护命令

文章目录 一、压缩和解压命令二、磁盘管理与维护命令总结 一、压缩和解压命令 Linux zip命令:压缩文件或目录 Linux unzip命令:解压文件或目录 Linux tar命令:归档工具 二、磁盘管理与维护命令 Linux df命令:显示磁盘空间使用情况 Linux mount命令:挂载文件系统 Linux quota命…

APK文件结构

文件结构 assets文件用来存放需要打包到Android 应用程序的静态资源文件&#xff0c;例如图片资源文件&#xff0c;JSON配置文件&#xff0c;渠道配置文件&#xff0c;二进制数据文件&#xff0c;HTML5离线资源文件等 与res/raw目录不同的数&#xff0c;assets目录支持任意深度…