Java异常机制
1.异常概述和异常处理机制
异常(exception)概述
异常就是程序在运行时出现的意外的,不正常的情况。
若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。
2.2 异常处理机制
所以我们在开发中要一套机制来处理各种可能会发生的异常,并对其作出正确的处理,确保程序的 正常执行。这种机制称为异常处理机制,java语言是最先提供异常处理机制的。
异常处理机制可以引导程序向正确的方向运行,不至于崩溃。
3 异常处理
java异常处理包含两种代码块。 一种是try...catch,一种是try...catch...finally.
3.1 try...catch
把有可能产生异常的代码放到try中,如果产生异常由catch代码块处理。语法
try{ // 可能产生异常的代码块 } catch(异常类型 ex){ // 异常处理 } // 后面如果还有代码,无论try中的代码有没有异常,这里都会继续执行 |
try...catch执行有三种情况 :
情况1:没有发生异常,正常执行
情况2:出现异常, catch代码块捕获异常,并进行异常处理。处理完成后程序继续执行。
需求1 : 从控制台输入两个数并做除法
import java.util.Scanner; public class TryCatchDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入第一个操作数:"); try{ int num1 = sc.nextInt(); System.out.println("请输入第二个操作数:"); int num2 = sc.nextInt(); int r = num1 / num2; System.out.println("r = " + r); }catch (Exception e){ // 负责处理异常 System.out.println("出现输入不匹配异常,然后处理"); } System.out.println("程序结束"); } } |
异常发生后,从异常发生的那句代码开始,程序不继续向下运行,立即转入异常处理。
情况3:异常不匹配
import java.util.InputMismatchException; import java.util.Scanner; public class Test01 { public static void main(String[] args) { // 需求:从控制台输入两个数并做除法 Scanner sc = new Scanner(System.in); System.out.println("请输入第一个操作数:"); try{ int num1 = sc.nextInt(); System.out.println("请输入第二个操作数:"); int num2 = sc.nextInt(); int r = num1 / num2; System.out.println("r = " + r); }catch (InputMismatchException e){ // 负责处理异常 System.out.println("出现输入不匹配异常,然后处理"); } System.out.println("程序结束"); } } |
异常不匹配,程序中断,此时我们就需要多重catch了。
3.2 多重catch
可以为try代码书写多个catch用于捕获多个具体的异常。
书写时 : 子类在上,父类在下。
import java.util.InputMismatchException; import java.util.Scanner; public class MutiCatchDemo { public static void main(String[] args) { System.out.println("begin"); divide("17", "0"); System.out.println("ending"); } public static void divide(String a, String b) { try { int x = Integer.parseInt(a); int y = Integer.parseInt(b); System.out.println(x / y); } catch (NumberFormatException e) { //处理数字格式化异常的代码 System.out.println("字符串不包含可解析的整数"); } catch (ArithmeticException e) { //处理算术异常的代码 System.out.println("除数不能为0"); } catch (Exception e) { //处理其他未知的异常 System.out.println("未知异常"); } } } |
3.3 异常对象
异常对象是出现异常时的那条语句产生的(jvm 自动创建)。
异常在java类中通过Exception或其具体子类创建,大多数情况下都是由其子类(命名方式:异常类型 +Exception)创建, Exception是所有异常类的父类。
常用方法 | 方法介绍 |
toString | 返回异常类型和异常信息 |
getMessage | 返回异常信息 |
printStackTrace | 打印堆栈信息(红色)。包含了异常信息,异常类型,异常位置,方便程序开发 阶段的调试(一般要打开),也是JVM默认的异常处理机制 |
java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at com.kal02.exception02.Test02.main(Test02.java:14)
异常堆栈信息:
第一句:表示异常类型和异常的Message构成
最后一句:包含具体发生异常的全路径类,方法,产生异常语句的行数。
com.kal02.exception02.Test02.main(Test02.java:14)
3.4 try...catch...finally
try...catch 和之前一样用于捕获并处理异常, finally代码块用于处理异常后的收尾工作。
不管是否发生异常, finally总执行。
finally的收尾工作包含释放内存、关闭文件、关闭网络连接、关闭数据库、关闭...
step 1: 打开文件 step 2: 操作文件 step 3: 关闭文件 |
存在return的try...catch...finally
public class TryCatchFinallyDemo { public static int div(int a,int b) { int r = 0; try { r = a / b; return r; } catch (Exception e) { System.out.println(e.toString()); } finally { System.out.println("我是finally"); } return r; } public static void main(String[] args) { System.out.println(div(10,0));; System.out.println("程序正常结束!"); } } |
总结:
. 存在return的try...catch...finally块,finally先执行,然后执行return , return 总是最后执行的。
添加try-catch快捷键
IDEA : Ctrl + Alt + T
4 异常分类
4.1 异常的继承体系
Throwable类有两个子类Error和Exception,分别表示错误和异常。
Exception 和Error的子类大都是以Error或Exception作为类名后缀。
4.1.1 Error
Error,表示代码运行时 JVM(Java 虚拟机)出现的问题。如系统崩溃或内存溢出等,不需要处理 Error,
常见的Error:
StackoverflowError:当应用程序递归太深而发生堆栈溢出时,抛出该错误。比如死循环或者没有 出口的递归调用。
outofMemoryError:因为内存溢出或没有可用的内存提供给垃圾回收器时, Java 虚拟机无法分配 一个对象,这时抛出该错误。比如new了非常庞大数量的对象而没释放。
1.4.2 Exception
Exception,表示程序在运行时出现的一些不正常情况, 一般大多数表示轻度到中度的问题,属于 可预测、可恢复问题。如除数为0,数组索引越界等,这种情况下,程序员通过合理的异常处理,确保程 序的正常运行直到结束,常见的Exception
ArrayIndexoutofBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等 于数组大小,则该索引为非法索引。
ArithmeticException:当出现异常的运算条件时,抛出此异常。例如, 一个整数“除以零”时,抛出 此类的一个实例。
. NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包 括:
异常体系分成: checked (编译)异常和runtime(运行)异常。
划分规则是, RuntimeException和其子类属于运行时异常,异常除了运行时异常,其他都是编译时异 常。
4.2 异常分类
4.2.1 运行时异常
runtime异常,顾名思义在编译时期不被检测,只有在运行时期才会被检查出来。
运行异常可以不使用try...catch处理,但一旦出现异常就将由JVM处理(打印堆栈信息)。
RuntimeException (运行时异常)通常是指因设计或实现方式不当而导致的问题。程序员小心谨慎是可 以避免的异常。如:事先判断对象是否为null就可以避免NullPointerException异常,事先检查除数不为 0就可以避免ArithmeticException异常。
运行时异常特点:
在编译阶段,Java编译器检查不出来。 一般的,程序可以不用使用try-catch和throws处理运行异常。
简而言之: 对于运行时异常程序可处理(使用try-catch或throws处理),可不处理。
4.2.2 编译时异常
编译时异常,顾名思义就是在编译时期就会被检测到的异常。除了RuntimeException以及子类以 外,其他的Exception及其子类都是编译异常,有时候也称之为检查时异常。
编译时异常特点:
在编译阶段,Java编译器会检查出异常,也就说程序中一旦出现这类异常,要么使用try-catch语句 捕获,要么使用throws语句声明抛出它,否则编译就不会通过。
简而言之: 程序要求必须处理编译异常,使用try-catch或throws处理。
常见面试题:请罗列常见的运行时异常和编译时异常(3-5个)
编译时异常(检查时异常) :程序必须做出处理, 一般继承于Exception
运行时异常:程序可处理,也可不处理。都继承于RuntimeException
意识:遇到不懂的异常类时,首先要分辨它属于检查时还是运行时异常。通过快捷键(ctrl+h)查看
5 声明异常
5.1 throws
在Java语言中通过throws声明某个方法可能抛出的各种异常。
当方法的定义者在定义方法时知道调用该方法时可能出现异常,定义者又不知道如何处理时,此时方法 定义者可以选择声明异常,使用throws关键字,可以声明多个异常,用( , )号分隔。形式:
[修饰符] 返回值类型 方法名(形参列表) throws 异常1,异常2,...{ } |
需求1:声明异常
public class Test01Throws { // divide方法可能有异常,但divide处理不了该异常,就通过throws声明异常,让divide方法的调 用者来处理 public static void divide(int a, int b) throws Exception { System.out.println(a / b); } public static void main(String[] args) { try { divide(3, 1); divide(1, 0);// 调用divide方法,调用者必须处理或再次抛出 } catch (Exception e) { e.printStackTrace(); } } } |
声明异常的原因:该方法自身处理不了该异常,只能使用throws提醒该方法的调用者需要处理异常。当
然调用者也有两种处理方式: 自己捕获处理或再次声明(要么try...catch ,要么也throws)。
需求2:异常继续上抛
public class Test01Throws { public static void main(String[] args) throws Exception{ // 调用divide方法,调用者必须处理或再次抛出 divide(1, 0); } //divide方法可能有异常,但divide处理不了该异常,就抛出,让divide方法的调用者来处理 public static void divide(int a, int b) throws Exception { System.out.println(a / b); } } |
在异常声明或者上抛出的过程中,应该遵循以下原则:能在调用处明确处理优先处理,否则继续上抛。
声明异常时要根据异常的分类来确定是否外界(调用处)是否必须处理该方法产生的异常。如果需要外界必 须处理,需要声明检查时异常,否则声明运行时异常。
6 手动抛出异常 throw
在实际开发过程中,开发者也可以根据程序的需要,手动抛出异常,通过throw关键字。语法
XxException ex = new XxException(); throw ex; 或者 throw new XxException(); |
当程序出现某种逻辑问题时由程序员主动抛出某种特定类型的异常。
public class ThrowDemo { public static void main(String[] args) { try { ThrowDemo.isExist("will"); } catch (Exception e) { System.out.println(e.getMessage());//对不起,用户名will已经存在 } } public static boolean isExist(String userName) throws Exception { String[] data = { "will", "lucy", "lily" }; // 模拟已经注册的用户名 if (userName != null && userName.length() > 0) { for (String name : data) { if (name.equals(userName)) {// 用户名相同,证明该用户已经存在 // 手动抛出一个异常表示存在的不正常情况 throw new Exception("对不起,用户名" + userName + "已经存在"); } } } return false; } } |
7 自定义异常
当JDK 中的异常类型不能满足程序的需要时(也即需要定义具体的业务异常时),可以自定义异常。
自定义异常的步骤
[1] 确定异常类型(编译时异常、运行时异常)。
[2] 继承异常的父类(编译时异常Exception、运行时异常RuntimeException)
[3] 声明构造方法
public class Student {
private String name;
private int age;public Student(String name, int age) {
this.name = name;
this.setAge(age);
}public Student() { }public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public int getAge() {
return age;
}public void setAge(int age) throws AgeException{
if( age < 0 || age > 120 ) {
// System.out.println("年龄值不合法");
// 能否手动抛出一个年龄异常呢?
AgeException ex = new AgeException("年龄值不能小于0或者不能大于120"); throw ex;
} else {
this.age = age;
}
}
}
测试
public class CustomExceptionDemo { public static void main(String[] args) { Student s1 = new Student("二狗",20); try { s1.setAge(130); } catch (AgeException e) { // System.out.println(e.toString()); System.out.println(e.getMessage()); } } } |
相关文章:
Java异常机制
1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的,不正常的情况。 若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...
Aws EC2,kubeadm方式安装kubernetes(k8s)
版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...
python 比较 mysql 表结构差异
最近在做项目的时候,需要比对两个数据库的表结构差异,由于表数量比较多,人工比对的话需要大量时间,且不可复用,于是想到用 python 写一个脚本来达到诉求,下次有相同诉求的时候只需改 sql 文件名即可。 com…...
【RAG入门教程01】Langchian框架 v0.2介绍
LangChain 是一个开源框架,旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...
python 做成Excel并设置打印区域
记录首次用python处理Excel表格的过程。 参考文章:https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情: 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时, 设置每…...
SpringAI(二)
大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...
小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦
下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址:https://www.ventoy.net/cn/,找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址,如下图所示。 4、如下就是我下…...
android 双屏异显-学习笔记
双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…...
Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB
一、说明 产品提出需求:用户有 8 个等级,每个等级对应一个奖牌动画。 按照常用的实现方式: 设计提供 8 个 lottie 动画(8 个 json 文件)。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …...
Django前端页面-模板继承
通过模板的继承,可以将所有共同的前端页面移到母版,那么其他页面就可以用到母版了。 这是母版 <!DOCTYPE html> <html><head>{% block css %}{% endblock %}</head><body><h1>母版</h1><div><!-- …...
使用HTML、CSS和JavaScript编写一个注册界面(一)
倘若文章或代码中有任何错误或疑惑,欢迎提出交流哦~ HTML和CSS 首先,我们需要编写一个简洁的注册界面。 简单编写下,如下: 呈现效果为: <!DOCTYPE html> <html lang"en"><head><me…...
什么是档案数字化管理
档案数字化管理指的是将传统的纸质档案转换为数字形式,并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤: 1. 扫描和数字化:将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR(光学字…...
vuInhub靶场实战系列--prime:1
免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…...
L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版
1.题目描述 2.思路 (1)返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点,按照等差数列那样,后一个数减去相邻的前一个数,才能保证两数之间不含其他数字。 (2)所以&…...
在线渲染3d怎么用?3d快速渲染步骤设置
在线渲染3D模型是一种高效的技术,它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力,从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果,在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是:云渲染…...
《软件定义安全》之二:SDN/NFV环境中的安全问题
第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…...
Qt图表类介绍
本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型:折线图,样条曲线图,面积图,散点图,条形图,饼图,方块胡须图,蜡烛图,极坐标图。 QCharts的图表框架类似…...
时隔很久运行苍穹外卖项目,出现很多错误
中途运行了很多其他项目,maven的配置文件还被我修改了一次。导致再次运行苍穹外卖项目出现很多错误。 发现没有办法,把本地的仓库删了个干干净净。然后点击clean发现报错: Cannot access alimaven (http://mavejavascript:void(0);n.aliyun.…...
补篇协程:协程(Coroutine)里通过挂起suspend函数实现异步IO操作
异步IO的概念 异步IO是一种非阻塞的数据读写方法,异步IO与同步IO相对。 当一个异步过程调用发出后,调用者不能立刻得到结果。 实际的IO处理部件在完成操作后,会通过状态、通知或回调机制来通知调用者。 在一个CPU密集型的应用中,…...
qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】
qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…...
开源项目学习——vnote
一、介绍 vnote是一款免费且开源的markdown编辑器,用C开发,基于Qt框架,windows/linux/mac都能用。 二、编译 $ git clone --recursive https://github.com/vnotex/vnote.git $ cd vnote && mkdir build $ cd build $ cmake ../ $ …...
5_1 Linux 计划任务
5_1 Linux 计划任务 文章目录 5_1 Linux 计划任务[toc]1. crontab 命令2. 计划任务书写格式 用途:按照设置的时间间隔,为用户反复执行某一固定的系统任务 软件包:cronie、crontabs 系统服务:crond 日志文件:/var/log/c…...
接口框架项目实战-pytest(六)csv数据驱动
csv 数据驱动 为了解决数据量大 导致yaml文件重复太多 yaml_util.py import osimport jsonpath import yamlfrom pytestdemo.common.base_util import get_path from pytestdemo.common.csv_util import analysis_parametersdef read_config_file(one_node,two_node):with ope…...
【Apache Doris】周FAQ集锦:第 5 期
【Apache Doris】周FAQ集锦:第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...
再读高考作文题
新课标I卷:讨论了随着互联网和人工智能的普及,问题是否会变得越来越少,要求考生写一篇文章,表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是 一直不会写作文,直到高中,才堪堪…...
小程序中实现自定义头部导航组件
在页面中实现自定义头部导航的组件,如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”,如果是项目中所有页面都想使用自定义的组件,可在app.json的window中全局配置"navigationStyle"…...
算数运算符与表达式(打印被10整除的数)
打印100以内(包含100)能被10整除的正整数 #include <stdio.h>#define UPPER 100int main() {int i 1;while (i < UPPER)if (i % 10 0)printf("%d\n", i);return 0; } 自增运算符 i 用于递增变量 i 的值。在 while 循环中…...
kv视频如何转码mp4格式,kv转换mp4最简单方法
在数字化时代,视频格式转换成为了一项日常需求。有时候我们需要把kv格式转换为MP4格式。下面将详细介绍kv转MP4的方法 方法一、 1、使用 "小白兔视频格式在线转换网站" 2、地址发给"小白兔视频格式在线转换网站"的客服,客服下载即可…...
哈夫曼树详解
哈夫曼树 例题 有n堆果子,每堆果子的质量已知,现在需要把这些果子合并成一堆,但是每次只能把两堆果子合并到一起,同时会消耗与两堆果子质量之和等值的体力。显然,在进行n-1次合并之后,就只剩下一堆了。为…...
LangChain4j实战
基础 LangChain4j模型适配: Provider Native Image Sync Completion Streaming Completion Embedding Image Generation Scoring Function Calling OpenAI ✅ ✅ ✅ ✅ ✅ ✅ Azure OpenAI ✅ ✅ ✅ ✅ ✅ Hugging Face ✅ ✅ Amazon Bedrock ✅ ✅…...
王野天 演员/北京seo优化排名推广
1.应用场景 主要用于了解App架构的演进过程,以及对比端上架构与后端架构的区别,联系。 2.学习/操作 1.文档阅读 49 | 谈谈App架构的演进-极客时间 [转]Web 研发模式演变——玉伯 - 知乎 2.整理输出 49 | 谈谈App架构的演进-极客时间 专栏截止到上一期&a…...
dede网站模板怎么安装教程/汕头网站建设方案优化
wdcp非常简单 非常好用但是有时候需要一些自定义配置的时候就不方便了1.去掉public_html 在安装有的程序的时候必须去掉这个 比如osa开源运维软件的时候方法 新建网站后 点击文件管理 选择--> 虚拟主机站点文件(nginx,apache) 根据你的web决定服务器然后找到对应的站点文件 …...
张浦专业做网站/西安百度推广代运营
http://www.infoq.com/cn/articles/HIgh-Performance-Parsers-in-Java-V2?utm_sourceinfoq&utm_mediumpopular_links_homepage...
公司网站流程/女教师网课入06654侵录屏
1. 域名访问失败但通过IP访问正常 发生此类型情况可能的原因如下: DNS 解析问题:域名访问失败可能是因为 DNS 解析出现了问题,导致域名无法解析成正确的 IP 地址。可以通过使用 nslookup 或 dig 命令来检查 DNS 解析是否正常。 域名解析错误…...
网站开发中间商怎么做/宁波如何做抖音seo搜索优化
AIoT时代不仅仅是AI+IoT,更重要的是赋能。美国在线创始人史蒂夫凯斯,提出“互联网三次浪潮”,个人电脑为基础的第一次浪潮,互联网建立;智能手机为代表的第二次浪潮,是应用生态与移动互联网的革命…...
济南微网站开发/百度一下首页网页手机版
jsp的常用指令有哪些(编译指令/动作指令整理) JSP动作指令 JSP - JSP中的脚本、指令、动作和注释...