Java小白入门到实战应用教程-异常处理
Java小白入门到实战应用教程-异常处理
前言
我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况,它能打断了正常的程序执行流程。
而异常处理是一项至关重要的技术,它使得程序能够优雅地处理运行时错误,避免程序崩溃,并且我们可以结合日志打印等动作可以排查一些线上环境产生的问题。
在java中关于异常的结构如下,我随便从网上找了一张结构图:
java中异常的结构如上图所示,所有异常最上层是Throwable,是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowError和OutOfMemoryError,一旦发生程序就崩溃
Exception : 异常产生后我们可以通过代码进行处理,使程序继续执行。
而Exception 又往下划分为编译异常和运行时异常。
编译异常比如上面图提到的ClassNotFoundException、IOException等,这类异常一旦存在程序在编译阶段就会被发现,是我们必须处理的异常。
运行时异常则是不容易被发现的异常,指的是在程序运行过程中可能产生的异常。
正文
因为Error不常遇到,编译异常在编译阶段就能被发现,所以需要我们做异常处理的通常指的是运行时异常。
Java的异常处理机制主要通过try
、catch
、finally
以及throw
、throws
关键字来实现。
- try-catch:将可能抛出异常的代码放在
try
块中,并通过一个或多个catch
块来捕获并处理这些异常。每个catch
块都指定了要捕获的异常类型及其处理逻辑。 - finally:
finally
块是可选的,但它总是会在try
块或catch
块之后执行,无论是否捕获到异常,也无论try
/catch
块中是否有return
语句。finally
块通常用于释放资源,如关闭文件流、数据库连接等。 - throw:用于显式地抛出异常。可以在方法内部使用
throw
关键字抛出一个异常对象,将错误向上传递给调用者。 - throws:如果一个方法可能会抛出检查型异常,但又不打算在方法内部处理这个异常,那么可以在方法声明时使用
throws
关键字声明这个异常,让方法的调用者负责处理。
try-catch
样例
public class Demo {public static void test(){String name = null;System.out.println("结果是:"+name.equals("111"));}public static void main(String[] args) {test();System.out.println("结束");}
}//运行结果
Exception in thread "main" java.lang.NullPointerExceptionat com.example.exceptions.Demo.test(Demo.java:15)at com.example.exceptions.Demo.main(Demo.java:19)
解释:在上面的Demo中我们定义了一个test方法,在test中我们声明了一个String变量name,然后输出了一下name的值是否为’111’.
因为name变量值为null,所以name.equals(“111”)就会抛异常了,然后程序就会中断,所以最后一句”结束“没有执行。
所以我们针对这个样例来做一个异常处理:
public class Demo {public static void test(){String name = null;boolean equals = true;try {equals = name.equals("111");}catch (Exception e){e.printStackTrace();equals = false;System.out.println("name.equals(\"111\")这句代码抛异常了,被try catch块捕获到了");}System.out.println("结果是:"+equals);}public static void main(String[] args) {test();}
}
//运行结果
java.lang.NullPointerExceptionat com.example.exceptions.Demo.test(Demo.java:17)at com.example.exceptions.Demo.main(Demo.java:28)
name.equals("111")这句代码抛异常了,被try catch块捕获到了
结果是:false
解释:我们通过try catch块去做异常处理,我们知道 name.equals(“111”)这句代码可能会发生异常,所以把这句代码放到try块中监控起来,然后在catch块中去捕获产生的异常,catch后面()中为我们要捕获异常的类型,我们这里写的Exception,因为Exception是所有运行异常的最上级,所以可以捕获所有的运行时异常。
然后再catch块中,我们通过e.printStackTrace();打印了一下捕获到的异常的堆栈信息,然后在下面写了两句业务的处理代码。
finally
我们在前面还提到了finally关键字,是可选的,但如果写了finally块,它总是会在try
块或catch
块之后执行,无论是否捕获到异常。
下面我们将finally块加到上面的代码中:
public class Demo {public static void test(){String name = null;boolean equals = true;try {equals = name.equals("111");}catch (Exception e){e.printStackTrace();equals = false;System.out.println("name.equals(\"111\")这句代码抛异常了,被try catch块捕获到了");}finally {System.out.println("finally块执行!");}System.out.println("结果是:"+equals);}public static void main(String[] args) {test();}
}
//运行结果:
java.lang.NullPointerExceptionat com.example.exceptions.Demo.test(Demo.java:17)at com.example.exceptions.Demo.main(Demo.java:30)
name.equals("111")这句代码抛异常了,被try catch块捕获到了
finally块执行!
结果是:false
throws
在上面的样例中我们直接在test方法源码处处理了异常,但是有的时候我们需要在函数的调用者处去处理异常,然后获取到异常的一些信息。所以针对这样的情况,java中可以通过关键字throws去实现。
throws关键字的作用就是将此处产生的异常往上层抛,抛给调用者,然后调用者可以通过try catch去捕获异常然后进行处理。
我们将上面样例修改一下,直接看样例:
public class Demo {public static void test() throws Exception{String name = null;System.out.println("结果是:"+name.equals("111"));}public static void main(String[] args) {try {test();} catch (Exception e) {e.printStackTrace();System.out.println("test函数发生异常");}System.out.println("结束");}
}
//输出结果
java.lang.NullPointerExceptionat com.example.exceptions.Demo.test(Demo.java:15)at com.example.exceptions.Demo.main(Demo.java:20)
test函数发生异常
结束
解释:我们可以看到在test方法声明后面我们通过关键字throws抛出了Exception,意思就是将Exception及它的子类异常都抛给方法的调用者。
然后我们在main函数中通过try catch将test()方法的调用语句进行监控起来了,然后程序运行的时候就能捕获test方法产生并抛出的异常。
throw
在前面的所有样例中,我们的异常都是程序运行产生的,其实我们还可以手动去抛出异常。手动抛出异常的应用场景通常是我们经过判断后觉得后面的程序不需要运行,并且需要输出一些原因。
通过return关键字也能实现中断方法继续运行的效果,但是如果输出一些日志啥的效果还得再加一些代码,但是通过手动抛出异常可以一举两得。
样例代码
public class Demo {public static void test() throws Exception{String name = "000";boolean equals = name.equals("111");if (!equals){throw new RuntimeException("name的值不是111,不继续运行后面的逻辑");}name = "222";}public static void main(String[] args) {try {test();} catch (Exception e) {System.out.println("test函数发生异常:"+e.getMessage());}System.out.println("结束");}
}
//结果输出:
test函数发生异常:name的值不是111,不继续运行后面的逻辑
结束
解释:我们在test方法中做了个判断当name的值不等于111的时候就手动抛出了一个运行时异常,异常中的message内容为:name的值不是111,不继续运行后面的逻辑。
如果name的值等于111,就将name的值修改为222.
然后我们在main函数中去捕获test方法的异常,并在catch块中将捕获的异常的message的内容进行了打印。
相关文章:

Java小白入门到实战应用教程-异常处理
Java小白入门到实战应用教程-异常处理 前言 我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况,它能打断了正常的程序执行流程。 而异常处理是一项至关重要的技术,它使得程序能够优雅地处理运行时错误,避免…...

使用Anaconda安装多个版本的Python并与Pycharm进行对接
1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示,我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单,直接安装即可: 3、设置conda.exe的…...

android系统中data下的xml乱码无法查看问题剖析及解决方法
背景: Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下: 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的,这些syste…...
MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX.语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Python数据可视化利器:Matplotlib详解
目录 Matplotlib简介安装MatplotlibMatplotlib基本用法 简单绘图子图和布局图形定制 常见图表类型 折线图柱状图散点图直方图饼图 高级图表和功能 3D绘图热图极坐标图 交互和动画与其他库的集成 与Pandas集成与Seaborn集成 常见问题与解决方案总结 Matplotlib简介 Matplotli…...

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)
2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda: 大家可以根据自己的网络情况从下面的地址下载: miniconda官网地址:https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…...
介绍rabbitMQ
RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),主要用于在不同的应用程序之间进行异步通信。以下是关于RabbitMQ的详细介绍: 一、基本概念 消息中间件:RabbitMQ是一个消息中间件&#x…...

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
关键词:深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升,且有可能演变成严重且不可逆转的状况,这不仅对家庭幸福构成威胁,还带来巨大的经济负担。当前的研究着重指出&#x…...
VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发
在VB.NET中,利用Windows Presentation Foundation (WPF) 进行图形界面开发是一个强大的选择,因为它提供了丰富的UI元素、动画、数据绑定以及样式和模板等高级功能。以下是在VB.NET项目中使用WPF进行图形界面开发的基本步骤: 1. 创建一个新的…...

Go语言标准库中的双向链表的基本用法
什么是二分查找区间? 什么是链表? 链表节点的代码实现: 链表的遍历: 链表如何插入元素? go语言标准库的链表: 练习代码: package mainimport ("container/list""fm…...

手机游戏录屏软件哪个好,3款软件搞定游戏录屏
在智能手机普及的今天,越来越多的人喜欢在手机上玩游戏,并希望能够录制游戏过程或者分享游戏技巧。然而,面对市面上众多的手机游戏录屏软件,很多人可能会陷入选择困难。究竟手机游戏录屏软件哪个好?在这篇文章中&#…...
【力扣】4.寻找两个正序数组的中位数
题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…...

【C++】初识面向对象:类与对象详解
C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…...

知识图谱学习总结
1 知识图谱的介绍 知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识,使信息资源更易于计算、理解以及评价,并能实现知识的快速响…...
2021-10-23 51单片机LED1-8按秒递增闪烁
缘由51单片机,八个LED灯按LED1亮1s灭1s,LED1亮2s 灭2s以此类推的方式亮灭-编程语言-CSDN问答 #include "REG52.h" sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_…...

在Linux中宏观的看待线程
线程一旦被创建,几乎所有的资源都是被所有的线程共享的。线程也一定要有自己私有的资源,什么样的资源应该是线程私有的? 1.PCB属性私有 2.要有一定的私有上下文结构 3.每个线程都要有独立的栈结构 ps -aL ##1. Linux线程概念 ###什么是线程…...
提示libfakeroot.so或libfakeroot-sysv.so出错处理方法
在RK3588 Buildroot SDK里面,uboot和kernel使用的是prebuild目录下的交叉编译链,而buildroot和APP编译则使用Buildroot生成的交叉编译链来编译(如:位于buildroot/output/rockchip_rk3588/host目录为交叉编译工具链目录)…...

【计算机网络】什么是socket编程?以及相关接口详解
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

LeetCode.19.删除链表的倒数第n个节点
题目描述: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点 输入输出实例: 思路:这道题目我们可以用双指针来做,让first和second指针之间的距离为n1,然后我们first和second指针…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...