Java_异常
Java_异常
1.什么是异常
生活中的异常:感冒发烧、电脑蓝屏、手机死机等。
程序中的异常:磁盘空间不足、网络连接中断、被加载的资源不存在等。
程序异常解决办法:针对程序中非正常情况,Java语言引入了异常,以异常类的形式对这些非正常情况进行封装,并通过异常处理机制对程序运行时发生的各种问题进行处理。
public class Test01 {public static void main(String[] args) {int num1 = 10;int num2 = 0;System.out.println(num1 / num2);}}

在Java中,左右的异常类型都是Throwable的子列,因为Throwable在异常类的层次结构的顶层。它有两个分支:
- Error:表示不希望被程序捕获或是程序无法处理的错误;
- **Exception:**表示用户程序可能捕获到的异常情况或者是程序可以处理的异常。
Error和Exception的区别和联系:
1.Error
-
Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
-
比如说: Java虚拟机运行错误( Virtual MachineError ),当JVM不再有继续执行操作所需的内存资源时, 将出现 OutOfMemoryError 。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
-
还有发生在虚拟机试图执行应用时,如类定义错误( NoClassDefFoundError )、链接错误 ( LinkageError )。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。
2.Exception -
Exception 分支中有一个重要的子类 RuntimeException (运行时异常),该类型的异常自动为你所编写的程序定义 ArrayIndexOutOfBoundsException (数组下标越界)、 NullPointerException (空指针异常)、ArithmeticException (算术异常)、 MissingResourceException (丢失资源)、 ClassNotFoundException (找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
-
而 RuntimeException 之外的异常我们统称为非运行时异常,类型上属于 Exception 类及其子类, 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException 、 SQLException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。
异常分为编译时异常和运行时异常。编译异常是指程序在编译时期产生的异常,而这些异常必须要进行处理,也称为checked异常。而运行时异常是指即使不编写异常处理代码,依然可以通过编译,也成为unchecked异常。

2.try-catch语句和finally
当程序发生异常时会立即终止,无法继续向下执行,为了保证程序能继续有效执行,Java提供了一种异常处理方式—异常捕获。其基本格式为:
try{// 可能发生异常的语句
} catch(Exception或其子类 e) {// 对捕获的异常进行响应的处理
} finally {// 一定执行的代码,一般用于释放资源
}
执行除法运算处理异常:
try {int num1 = 10;int num2 = 0;System.out.println(num1 / num2);
} catch (ArithmeticException e) {e.printStackTrace(); // 打印异常消息
} finally {System.out.println("这里的代码都会执行。。。");
}
3.throws关键字
如果不确定或不急于处理的异常,怎么办?
一般在程序开发中,开发者通常会意识到程序可能出现问题,可以直接通过try-catch对异常进行捕获。但有些时候,方法中代码是否会出现异常,开发者并不明确或不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。这个时候我们就可以采用throws关键字用在方法上声明抛出的异常,多个异常之间使用逗号分隔即可。
其语法格式为:
[修饰符] 返回值类型 方法名(参数) throws 异常1,异常2...{// 方法体
}
定义除法的方法,处理除数不能为0的异常:
public static void main(String[] args) throws Exception {divide(10,0);
}
public static void divide(int num01,int num02) throws Exception{System.out.println(num01 / num02);
}

在程序中,除了可以通过throws抛出异常外,还可以使用throw关键字抛出异常。
- **throws:**用在方法声明中,用来指明方法中抛出的多个异常。
- **throw:**用在方法体中,并且抛出的是一个异常类对象。
public static void main(String[] args) {getAge(-23);
}
public static void getAge(int age){System.out.println("年龄是:" + age);
}
我们发现在获取年龄的方法getAge()中传递了一个-23岁的年龄,这显示是不符合常理的,所以这个时候我们就可以在程序中对这个异常进行处理:
public static void main(String[] args) throws Exception {getAge(-23);
}
public static void getAge(int age) throws Exception {if(age < 0 || age > 200) {throw new Exception("年龄不合法!");} else {System.out.println("年龄是:" + age);}
}

如果想要正常打印错误,也可以进行如下处理:
public static void main(String[] args) {try {getAge(-23);} catch (Exception e) {System.out.println(e.getMessage());}
}
public static void getAge(int age) throws Exception {if(age < 0 || age > 200) {throw new Exception("年龄不合法!");} else {System.out.println("年龄是:" + age);}
}

4.自定义异常
Java中定义了大量的异常类,虽然这些异常类可以应付大多数场景的异常情况,但在程序中有时需要描述程序中特有的异常情况,例如在divide()方法中不允许除数为负数。
这个时候我们就需要使用自定义异常,使用自定义异常时必须继承自Exception或其子类。
public class MyException extends Exception{public MyException() {} public MyException(String msg) {super(msg);}
}
public static void main(String[] args) {try{divide(10,0);} catch (MyException me) {me.printStackTrace();}
}public static void divide(int num1,int num2) throws MyException {if(num2 < 0 || num2 == 0) {throw new MyException("除数不能为0或负数。。");} else {System.out.println(num1 / num2);}
}

5.垃圾回收
在Java中,当一个对象称为垃圾后仍占用内存空间,时间一长就会累积很多的垃圾,这样就会导致内存空间不足。针对这种情况,Java引入了垃圾回收机制(Java GC)。有了垃圾回收机制,Java虚拟机会自动回收垃圾所占用的内存空间。
除了虚拟机自动回收外,程序员也可以使用手动垃圾回收的方式,以通知系统回收垃圾,手动回收的两种方式为:
-
System.gc() -
Runtime.getRuntime.gc()当一个对象在内存中被释放时,它的
finalize()方法会被自动调用,如果程序终止之前仍没有进行垃圾回收,则不会调用失去引用对象的finalize()方法来清理资源。
public static void main(String[] args) {method01();method02();
}public static void method01() {Person p = new Person();p = null; // 置为null,让其变为垃圾for (int i=1;i<=10;i++) {System.out.println("aaa");}
}
public static void method02() {Person p = new Person();p = null; // 置为null,让其变为垃圾// System.gc();Runtime.getRuntime().gc();for (int i=1;i<=10;i++) {System.out.println("bbb");}
}
}
}
public static void method02() {
Person p = new Person();
p = null; // 置为null,让其变为垃圾
// System.gc();
Runtime.getRuntime().gc();
for (int i=1;i<=10;i++) {
System.out.println(“bbb”);
}
}
我们发现手动垃圾回收都不确定垃圾释放后还会不会执行其它程序,充满了不确定性。因此更多的是采用JVM的垃圾回收机制,不需要手动回收。
相关文章:
Java_异常
Java_异常 1.什么是异常 生活中的异常:感冒发烧、电脑蓝屏、手机死机等。 程序中的异常:磁盘空间不足、网络连接中断、被加载的资源不存在等。 程序异常解决办法:针对程序中非正常情况,Java语言引入了异常࿰…...
自动化工具 接口自动化测试引擎
一、前言: 1、解决痛点:接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理:根据定义的测试策略自动生成接口测试用例。 二、引擎优势: 1、提升人效:降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…...
十三、详解Kubernetes的存储管理器
Kubernetes是一个开源的容器编排系统,它可以自动化地管理容器的部署、扩展和运维。在Kubernetes中,存储管理器是一个重要的组件,它负责管理容器的存储资源,包括持久化存储和临时存储。 Kubernetes的存储管理器主要有以下几个功能: 提供持久化存储:Kubernetes的存储管理器…...
java版 工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...
VMware 安装 MS-DOS7.10 并配置网络
VMware 安装 MS-DOS7.10 并设置软盘共享 1. 新建虚拟机2. 开机2.1. 这几个地方都可以开机2.2. 手速慢,进不了BIOS的朋友可以点这里 安装 MS-DOS7.101. 先选 1 安装 MS-DOS7.10 回车2. 欢迎页面,客气一下而已,继续 Next3. 继续王婆卖瓜4. 这步…...
嵌入式51单片机04-矩阵按键系列
文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作(显示数字)(1)仿真电路图(2)源代码(3)实验结果 2. 矩阵按键操作(控制数码管)&am…...
某安全对抗行走APP逆向分析
1.定位url 抓包: https://api5.xxxx.com/xxx-rest-service/message/fun_getnearby 看一下参数: opentime:时间戳 reqdata:base64编码 sign 未知,需要解密 # -*- coding: utf-8 -*- # @Author : Codeooo # @Time : 2022-10-14import frida, sysm199a = "&qu…...
数据库基础篇 《11.数据处理之增删改》
目录 1. 插入数据 1.1 实际问题 1.2 方式1:VALUES的方式添加 1.3 方式2:将查询结果插入到表中 2. 更新数据 3. 删除数据 4. MySQL8新特性:计算列 5. 综合案例 6. 课后练习 练习1 练习2 1. 插入数据 1.1 实际问题 解决方式&#x…...
IDEA插件-MavenHapler
1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件,可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项,查看依赖项的冲突,以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面: 在插…...
getaddrinfo调用crash 的debug过程
前两天,产线报一例crash问题。拿到core文件后,栈展开信息: (gdb) bt #0 0x00007f64a3651aff in raise () from /lib64/libc.so.6 #1 0x00007f64a3624ea5 in abort () from /lib64/libc.so.6 #2 0x00007f64a3694097 in __libc_message () …...
【Sql】sql语句练习随记
本文通过最经典的“学生-成绩-课程-教师”表来帮助练习sql语句。 STUDENT表 SNO 学号SNAME 姓名SSEX 性别SBIRTHDAY 生日CLASS 班级 SCORE表 SNO 学号CNO 课程编号DEGREE 分数 COURSE表 CNO 课程编号CNAME 课程名称TNO 教师编号 TEACHER表 TNO 教师编号TNAME 教师姓名TS…...
IDEA社区版搭建Tomcat服务器并创建web项目
IDEA社区版搭建Tomcat服务器并创建web项目 目标 创建Web项目的目录结构可以启动Tomcat服务器编写Servlet并访问成功 问题 IDEA社区版没有创建Web工程的选项IDEA社区版没有Tomcat插件 实现步骤 针对以上两个问题,分步解决 问题一:IDEA社区版没有创建…...
C++ [STL-简介]
本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言 STL(standard tem…...
牛客前端编程语言错题2
【语法】 名为“ctx”的变量是某个HTML5画布对象的上下文。以下代码绘制的是什么() Ctx.arc(x,y,r,0,Math.PI,true); 在给定点绘制一个矩形 从一个点到另一个点绘制一条直线 在给定点绘制一个半圆 在给定点绘制一个圆 链接:https://www.now…...
【C语言】基础语法3:控制流程结构
上一篇:运算符和表达式 下一篇:函数和递归 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…...
MySQL安全性:防止攻击和保护数据
MySQL安全性:防止攻击和保护数据 MySQL是当今最流行的关系型数据库之一,然而,随着Internet的普及,数据库安全问题也越来越受到关注。在这篇文章中,我们将重点介绍MySQL的安全性问题,以及如何防止攻击和保护…...
R语言结构方程模型(SEM)
详情点击链接:R语言结构方程模型(SEM)生态学领域应用 一,R语言SEM分析入门:lavaan VS piecewiseSEM 结构方程模型在生态学研究中的应用及模型结构方模型估计方法:局域估计和全局估计的基本工作原理、主要…...
软件or硬件?硬件的前途到底在哪里?
一、硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件? 1、不需要太高层次的硬件设计,比如大部分小家电企业,简单的电子产品企业,单片机简单外围设计就够了,单片机…...
同学在外包干了两年的点点点,24岁人就快废了
前言 简单的说下,我大学的一个同学,毕业后我自己去了自研的公司,他去了外包,快两年了我薪资、技术各个方面都有了很大的提升,他在外包干的这两年人都要废了,技术没一点提升,学不到任何东西&…...
基于Java springboot 疫情在线网课管理系统
博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 一、前言介绍1.1 背景及意义1.2 系统运行环境…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
