【JavaSE】异常

异常概述

异常指的是程序在执行的过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。

在Java中,使用不同的类来表示不同的异常(正所谓万物皆对象,因此异常也使用类来表示)。一旦程序出现某种异常就创建该异常类型的对象,并且抛出。然后,程序如果捕捉到这个异常对象,那么就会进行处理;如果没有捕捉到这个异常对象,那么就会导致程序非正常停止。

因此,程序员在编写代码的时候,就要充分考虑到各种可能发生的异常和错误,极力进行避免和预防。对于实在无法避免的,要编写相应的代码进行异常的检测、异常的处理,从而增强代码的健壮性。

异常的体系结构

Throwable

java.lang.Throwable 类是Java程序执行过程中发生的异常事件对应类的根父类。

Throwable 类存在两个子类,分别是:Error、Exception。

Error

Error 类表示的异常是:Java虚拟机无法解决的严重问题。如,JVM系统内部错误、资源耗尽等情况。一般是不会编写针对性的代码进行处理,毕竟编写代码也不好处理。

StatckOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出,简称OOM)是Error较为常见的场景,一般中高级程序猿才能处理这种问题。

Exception

Exception 类表示的异常是:其他因编程错误或偶然的外在因素导致的一般性问题,需要编写针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序就会挂掉。例如:

  • 空指针异常
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

Exception 异常又分为编译时异常(在执行javac命令时出现的异常,因此也被称为受检异常)和运行时异常(在执行java命令时出现的异常,因此也被称为非受检异常)。

 异常的处理方式

try-catch-finally

抛抓模型

对于抛抓模型来说,分为两个过程:一抛一抓。

对于抛过程来说,在程序执行的过程中,一旦出现异常,那就会在产生异常的代码处生成对应异常类的对象,并将此对象抛出。一旦将对象抛出,那么就不会再继续执行代码,等待抓过程的实现。

对于抓过程来说,当抛出异常时,抓过程就开始了。程序针对抛过程产生的异常对象进行捕获处理。一旦将异常处理,那么程序就会继续执行,但是如果并没有处理掉,那么程序就会终止。

基本结构

try {

        // 可能产异常的代码

}

catch (异常类型1) {

        // 当产生异常类型1时的处置措施

}

catch (异常类型2) {

        // 当产生异常类型2时的处置措施

}

finally {

        // 无论是否发生异常,都无条件执行的代码

}

 对于try结构来说,其中存放的就是可能产生异常的代码。当异常出现时,就会生成对应异常类的对象并抛出,并且无论是否处理了异常,try结构中产生异常代码之后的代码都不会继续执行。值得注意的是,try结构中的变量,出了try结构就不能使用。

对于catch结构来说,其中存放的是处理某种异常类的代码。一个try结构可以对应无数个catch结构,毕竟代码可能产生的异常不止一种类型。对于try抛出的异常对象来说,catch结构就会进行匹配,一旦匹配上,就会执行catch结构中的代码,执行完毕之后,继续向下执行。值得注意的是,如果声明了多个catch结构,不同的异常类型不存在子父类的情况下,谁声明在上,谁声明在下都可以;如果多个类型满足子父类的情况,则子类必须声明在上面,父类必须声明在下边。

对于finally结构来说,其中存放的就是一定要执行的代码,也就是说,无论能否处理了异常,finally结构中的代码一定会执行(唯一例外的就是如果使用System.exit(0)来结束当前正在运行的Java虚拟机,那么就不会有任何的代码进行执行)。所以,当有一定要执行的代码时,就要把他放到finally结构中(例如在开发中,有一些资源,如输出流、输入流、数据库连接以及Socket连接等,在使用完成之后,必须有显式的关闭。否则,GC会认为这些代码还要使用,就不会进行回收利用,进而导致内存泄漏。像这样的就可以把关闭操作放在finallyt中)。

注意,try是必须存在的,catch和finally两者可以同时存在,也可以存在一个,但是不能都不存在。

catch中处理异常的方式

1. 自己编写输出语句,表示异常的出现。

2. printStackTrace(),打印异常的详细信息。(推荐)

3. getMessage(),获取发生异常的原因

开发心得

1. 对于运行时异常,通常不进行显式的处理。一旦在程序运行过程中,出现了运行时异常,那么就根据异常的提示信息修改代码即可。

2. 对于编译时异常,一定要进行处理,否则编译不通过。

throws

基本结构

public void test() throws 异常类型1, 异常类型2 ... {

        // 存在编译时异常

}

 对于throws这种处理异常的方式来说,其实就是在方法声明的地方抛出了异常,当A方法调用此方法时,A方法继续抛出异常,B方法调用A方法时,继续抛出异常。如果异常真正发生了,那么程序照样会终止。因此这种方式存在的一个问题就是:是否真正处理了异常?

是否真正处理了异常?

1. 从编译是否能通过的角度看,也看成是给出了异常万一出现的解决方法。而所谓的解决方案就是继续向上抛出。

2. 如果说,throws仅是将可能出现的异常抛给了此方法的调用者。调用者仍然需要考虑如何解决处理相关异常。那么从这个角度来说,就不算解决了异常。

开发中两种方式的选择

1. 资源一定要被执行:try-catch-finally。

2. 如果父类被重写的方法没有 throws 异常类型,则子类重写的方法中如果出现异常,只能考虑使用 try-catch-finally 进行处理,不能 throws。

3. 开发中,方法a中依此调用了b、c、d等方法,方法b、c、d之间是递进关系。此时,如果方法b、c、d中有异常,我们通常使用throws,而方法a中通常选择使用try-catch。

手动抛出异常

在实际开发中,如果出现不满足具体场景的代码问题,我们就有必要手动抛出一个指定类型的对象。通俗的说,就是在实际问题的解决中,我们不想出现某些数据,那此时就可以手动抛出。

结构:throw + 异常类的对象。

所谓的手动抛出,就是抛抓模型中的抛过程。只不过手动抛出,而非程序自动抛出。

自定义异常

如何自定义异常类?

1. 继承于现有的异常体系。

2. 通常提供几个重载的构造器。

3. 提供一个全局变量,声明为:static final long serialVersionUID

如何使用自定义异常类?

1. 在具体的代码中,满足指定条件的情况下,需要手动的使用throw + 自定义异常类对象的方式,将异常类对象抛出。

2. 如果自定义异常类是非运行时异常,则必须考虑如何处理此异常类的对象(正是异常处理的两种方式)。

为什么需要自定义异常类?

更希望通过异常类的名称来判断具体出现的问题。

举例

/*** 自定义异常*/public class CustomException extends Exception{public CustomException() {super();}public CustomException(String message) {super(message);}public CustomException(Throwable cause) {super(cause);}}

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

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

相关文章

【HTML】HTML基础5(特殊字符)

目录 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 当我在两个文字间打出空格时 <p>“银河护卫队”系列 在漫威电影宇宙中一直是异数般的存在&#xff0c;不仅因为影片主角是一群反英雄&#xff0c;<strong>与超级英雄相比显得格格不入<…

LeetCode 刷题 [C++] 第347题.前 K 个高频元素

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 题目分析 据题意可知&#xff0c;我们需要先遍历整个数组&#xff0c;并统计每个数字出现的次数&#xff0c;保存在哈希表中&#xff1b;对元素…

synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录 &#x1f490;synchrosized的可重入特性关于死锁&#xff1a;哲学家就餐问题&#x1f4a1;如何避免/解决死锁 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;当一个线程针对一个对象同时加锁多次&#xff0c;不会构成死锁&#xff0c;这样的特性称为…

前端学习第一天-html基础

达标要求 网页的形成过程 常用的浏览器及常见的浏览器内核 web 标准三层组成 什么是HTML 熟练掌握HTML文档结构 熟练掌握HTML常用标签 1. 初识web前端 Web前端是创建Web页面或App等前端界面呈现给用户的过程。 Web前端开发是从网页制作演变而来&#xff0c;早期网站主…

sklearn.preprocessing.RobustScaler(解释和原理,分位数,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解释和原理&#xff0c;分位数&#xff0c;四分位差&#xff09; 文章目录 [TOC](文章目录) 一、RobustScaler 是什么&#xff1f;二、代码1.代码2.输出结果 总结 提示&#xff1a;以下是本篇文章正文内容&…

ELK学习

ELK 一、ELK介绍 &#x1f604; “ELK”是三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0…

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

【电机仿真】空间矢量脉宽调制(SVPWM)算法与实现

前言 文章【电机仿真】永磁同步电机模型中所提及了PMSM数学模型&#xff0c;模型算法是电机控制的理论基础&#xff0c;但在实际控制中&#xff0c;需要将这两部分具象化。实际电机所需要的总是三相电流或者电压&#xff0c;控制对象为逆变器中的开关器件&#xff0c;我们需要将…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分&#xff0c;跟pmon的关系不大&#xff01;&#xff01; 参考手册&#xff1a;《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册&#xff0c;让我是有点惊讶&#xff0c;但是也让我迷惑。&#xff08;一个串口复用为4个是啥意思&#xff1f;&#xff09;…

Java项目:32 基于springboot的课程作业管理系统(含源码数据库+文档免费送)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1a;首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

程序项目打包发布方法,采用InstallShield软件

重点&#xff1a; 1.程序项目做出来了&#xff0c;需要打包发布给用户。如何打包是关键。 2.采用InstallShield软件进行发布。 步骤一&#xff1a;创建一个依赖三方库配置环境的bat文件的项目。 &#xff08;主要测试三方库打包 和如果有bat文件&#xff0c;需要先创建环境&…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的商业辅助决策系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现&#xff0c;采…

Leetcode210. 课程表 II

Every day a Leetcode 题目来源&#xff1a;210. 课程表 II 解法1&#xff1a; 什么是拓扑排序&#xff1f; 我们考虑拓扑排序中最前面的节点&#xff0c;该节点一定不会有任何入边&#xff0c;也就是它没有任何的先修课程要求。当我们将一个节点加入答案中后&#xff0c;我…

html5新增标签+css3新增标签

新增标签 一.html5新增标签1.语义化标签2.多媒体标签&#xff08;1&#xff09;视频video&#xff08;2&#xff09;音频audio&#xff08;3&#xff09;.总结 3.input属性4.表单属性 二.css3新增选择器1.新增选择器&#xff08;1&#xff09;属性选择器&#xff08;2&#xff…