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 系统运行环境…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...