Java基础:异常(三)

Java基础:异常(三)


文章目录

  • Java基础:异常(三)
    • 1. Java异常体系
      • 1.1 错误的分类
      • 1.2 异常的分类
    • 2. 异常的捕获与处理
      • 2.1 try-catch
      • 2.2 finally
    • 3. 异常的抛出
    • 4. 自定义异常


1. Java异常体系

Java的异常体系是Java中用于处理运行时错误和其他异常情况的重要机制。它基于一个层次结构,其中Throwable是所有错误和异常的基类。在Java中,主要有两种类型的可抛出对象:ErrorException。Java的异常体系,可以保证程序的健壮性。

java异常体系

1.1 错误的分类

Java中的程序错误分为三类:

  • 编译错误(Compilation Error):编译错误是在程序源代码被编译器处理(即编译)成可执行文件时发生的错误,这些错误通常是由于违反了编程语言的语法规则或编译器无法理解的代码结构造成的。
  • 运行错误(Runtime Error):运行错误是程序在运行时(即执行时)发生的错误,这些错误通常是由于程序试图执行无效的操作或访问不存在的资源造成的。在Java中,运行错误通常表现为异常(Exception)。异常是一种特殊的对象,用于表示程序运行时的错误情况。
  • 逻辑错误(Logical Error): 逻辑错误是程序在逻辑上不正确或不符合预期的错误,这些错误通常是由于程序员的编程逻辑错误或对问题的不正确理解造成的。逻辑错误不会导致程序崩溃或产生异常,但会导致程序产生不正确的结果或行为。

1.2 异常的分类

Java中的异常分为两类:

  • 检查型异常(Checked Exception):检查型异常在编译时会被检查,如果方法可能抛出检查型异常,但该方法没有使用throws关键字声明该异常,或者没有捕获该异常,那么编译器会报错。
检查型异常说明
IOException输入输出流异常
SQLExceptionSQL异常
FileNotFoundException文件找不到异常
ClassNotFoundException类找不到异常
InterruptedException线程中断异常
  • 非检查型异常(Unchecked Exception):未检查型异常是指RuntimeException(运行时异常)类及其子类异常,在编译时不会被检查,它们通常是由程序逻辑错误引起的。
运行时异常说明
RuntimeException运行时异常父类
ArithmeticException算术异常,如除零操作
ArrayIndexOutOfBoundsException数组下标越界异常
NullPointerException访问null对象引用
NumberFormatException数字格式异常
java.lang.ClassCastException类型转换异常

2. 异常的捕获与处理

2.1 try-catch

在一个try块中,可能会产生多个异常,在后面可以接多个catch,去捕捉不同的异常。如果try块中,出现异常,直接进入对应的catch块中,try块中出现异常后的代码不会继续执行。语法格式如下:

try {  // 尝试执行可能会抛出异常的代码  // ...  
} catch (ExceptionType1 e) {  // 处理ExceptionType1类型的异常  // ...  
} catch (ExceptionType2 e) {  // 处理ExceptionType2类型的异常  // ...  
} 
// 可以有多个catch块来处理不同类型的异常

从JDK7版本之后,可以在一个catch块中,捕捉多个异常。代码示例如下:

package com.coder.exception;
import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入两个数:");int x = scanner.nextInt();int y = scanner.nextInt();int m[] = new int[10];try {int z = x / y; // y=0System.out.println(z);m[10] = 10; // 数组下标越界System.out.println(m[10]);} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { // >=JDK7版本// 获取错误消息System.out.println("出现错误:" + e.toString());}}
}

🆚🆚运行结果:

请输入两个数:
10 2
5
出现错误:java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10请输入两个数:
10 0
出现错误:java.lang.ArithmeticException: / by zero

如果trycatch操作出现嵌套情况,内部的catch如果不能处理内部try代码块的异常,则由外部的catch块进行捕捉。代码示例如下:

public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入两个数:");int x = scanner.nextInt();int y = scanner.nextInt();int m[] = new int[10];try {int z = x / y; // y=0System.out.println(z);try {m[10] = 20; // 数组下标越界System.out.println(m[10]);//String str = null;//System.out.println(str.toLowerCase());} catch (NullPointerException e) { // 非检查型异常 空指针异常System.out.println("数组下标越界");}} catch (ArithmeticException e) {// 打印异常堆栈轨迹e.printStackTrace();} catch (ArrayIndexOutOfBoundsException e) {System.out.println("外面的catch块处理数组下标越界");}}
}

🆚🆚运行结果:

请输入两个数:
10 2
5
外面的catch块处理数组下标越界请输入两个数:
10 0
java.lang.ArithmeticException: / by zeroat com.coder.exception.Test.main(Test.java:18)

📌:异常消息的处理包括:

  1. e.getMessage(),获取异常信息;
  2. e.toString(),获取异常类和信息;
  3. e.printStackTrace(),打印异常堆栈轨迹。

2.2 finally

以下是finally的执行流程:
finally
其语法格式如下:

try {// 尝试执行可能会抛出异常的代码
} catch (具体的异常类 e) {
} finally {//释放资源
}
  • 使用finally完成资源释放。例如:关闭打开的连接,删除临时文件,关闭打开文件。
  • finally不管是否出现异常,都会被执行到。如果trycatch块中,有return语句,finallyreturn
    码之前执行。
  • 如果trycatch代码块中,执行了System.exit(0)退出虚拟机操作,finally代码块中的语句不再执行。

代码示例如下:

public class Test2 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入两个数:");int x = scanner.nextInt();int y = scanner.nextInt();int m = test(x, y);System.out.println(m);}public static int test(int x, int y) {System.out.println("进入test方法");int z = 0;try {z = x / y; // y=0System.out.println("除法执行完成");System.exit(0);  // 退出虚拟机操作return z;} catch (ArithmeticException e) {return 0;} finally {System.out.println("关闭连接");return -1;}}
}

🆚🆚运行结果:

请输入两个数:
10 2
进入test方法
除法执行完成10 0
进入test方法
关闭连接
-1

📌trycatchfinally不能单独使用:

  1. trycatch使用;
  2. trycatchfinally使用;
  3. tryfinally使用。

3. 异常的抛出

  • throws用法:用于声明一个方法可能会抛出的异常列表,但它并不处理这些异常。谁来调用这个方法,谁处理这些异常。throws后面可以接多个异常类型,中间使用逗号分隔。
  • throw用法:使用throw抛出明确的异常处理,语法格式:throw new ExceptionType(parameters);throw在方法体内的语句,如果抛出的是运行时异常,可以不需要做任何处理。如果抛出的是检查型异常,不能单独使用,必须要配合try-catch或者throws使用。

代码示例如下:

public class Test4 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入姓名和年龄:");String name = scanner.next();int age = scanner.nextInt();System.out.println("姓名:" + name + "," + "年龄:" + age);Person person = new Person(name, age);// 2. 使用try-catch块:处理检查型异常时,在调用方法的代码周围使用try-catch块来捕获并处理异常。try {checkPersonInfo(person);} catch (FileNotFoundException e) {e.printStackTrace();}}// 1. 在方法签名中使用throws关键字:如果你不想在当前方法中处理异常,你可以使用throws关键字将异常声明给方法的调用者。public static void checkPersonInfo(Person person) throws FileNotFoundException {if (person.getAge() < 18) {throw new NullPointerException("年龄必须在18岁以上"); // 使用throw抛出运行型异常}if (person.getName().length() < 2) {throw new FileNotFoundException("姓名必须是2位以上"); // 使用throw抛出检查型异常,必须要配合try-catch或者throws使用}}
}

🆚🆚运行结果:

请输入姓名和年龄:
张三 10
姓名:张三,年龄:10
Exception in thread "main" java.lang.NullPointerException: 年龄必须在18岁以上at com.coder.exception.Test4.checkPerName(Test4.java:30)at com.coder.exception.Test4.main(Test4.java:21)请输入姓名和年龄:
张 18
姓名:张,年龄:18
java.io.FileNotFoundException: 姓名必须是2位以上at com.coder.exception.Test4.checkPerName(Test4.java:33)at com.coder.exception.Test4.main(Test4.java:21)

📌

  1. 运行时异常通常表示编程错误或不可恢复的错误情况,如数组越界、空指针引用等。因此,在编写代码时应该尽量避免抛出运行时异常,除非确实出现了无法恢复的错误。
  2. 与检查型异常不同,运行时异常在方法签名中不需要使用throws关键字来声明。这是因为运行时异常在编译时期不会被检查,所以编译器不会强制要求你处理这些异常。
  3. 虽然运行时异常在编译时期不需要被显式处理,但在实际编程中,最好还是捕获并处理这些异常,以确保程序的健壮性和可维护性。

4. 自定义异常

自定义异常是指在Java程序中根据特定业务需求创建的异常类,这些类继承自Exception类或其子类(如RuntimeException),以提供更详细的错误信息和更准确地表达特定的业务含义。代码示例如下:

public class AgeException extends Exception{public AgeException(){super("年龄不符合要求");}public AgeException(String message){super(message);}
}

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

以上内容是关于Java异常的基础知识,希望对初学者或再次学习者有所帮助,基础打扎实,不怕风吹雨打!如果以上内容有错误或者内容不全,望大家提出!我也会继续写好每一篇博文!
👍👍👍

待续未完
🙊🙊🙊

欢迎观看和提问!!!
👏👏👏

赞

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

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

相关文章

ubuntu20 安装Anaconda

Anaconda官网&#xff1a;Anaconda | The Operating System for AI 然后就开始下载了。下载完 直接打开终端运行 bash Anaconda3-2024.02-1-Linux-x86_64.sh 按回车ENTER 一直空格&#xff0c;直到 yes&#xff0c;回车 确认安装路径&#xff0c;默认即可&#xff0c;直接回车…

SQL Server定期收缩日志文件详细步骤——基于SQL Server 2012

SQL Server定期收缩日志文件详细步骤 一、环境配置1、查看数据库的属性2、文件设置3、备份模式4、查看收缩配置5、查看收缩选项 二、编写作业计划1、选择新建作业2、常规配置3、步骤4、输入内容5、脚本详解6、新建计划7、输入名称、选择执行时间8、查看测试9、查看测试结果 一、…

【最优化方法】实验四 约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生较为熟练使用MATLAB软件&#xff0c;并能利用该软件进行约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、罚函数法的MATLAB实现 &#xff12;、可行方向法的MATLAB实现 学习建议&#xff1a; 本次实验就是要通…

国际标准引脚,宽范围工作温度–40℃ 到 105℃,3W 1.5KVDC 隔离单输出 DC/DC 电源模块 ——TPL-3W系列

TPL-3W系列是一款额定功率为3W的隔离产品&#xff0c;国际标准引脚&#xff0c;宽范围工作温度–40℃ 到 105℃&#xff0c;在此温度范围内都可以稳定输出3W&#xff0c;并且效率非常高&#xff0c;高达88%&#xff0c;同时负载调整率非常低&#xff0c;对于有输出电压精度有要…

失落的方舟台服封号的解决方法 怎么避免封号?

失落的方舟台服封号的解决方法 怎么避免封号&#xff1f; 失落的方舟这款游戏是由Smile Gate研发的MMORPG游戏&#xff0c;这款游戏将于5月30日正式开服。游戏采用虚幻3引擎&#xff0c;为玩家们提供了丰富的游戏玩法与精美的游戏画面。游戏的背景是在中世纪&#xff0c;玩家们…

网络原理-------TCP协议

文章目录 TCP协议TCP协议段格式TCP原理确认应答机制 (安全机制)超时重传机制 (安全机制)连接管理机制 (安全机制)滑动窗口 (效率机制)流量控制 (安全机制)拥塞控制 (安全机制)延迟应答 (效率机制)捎带应答 (效率机制) 基于TCP的应用层协议 TCP协议 TCP, 即 Transmission Contr…

C# TcpClient

TcpClient 自己封装的话&#xff0c;还是比较麻烦的&#xff0c;可以基于线程&#xff0c;也可以基于异步写&#xff0c;最好的办法是网上找个插件&#xff0c;我发现一个插件还是非常好用的&#xff1a;STTech.BytesIO.Tcp 下面是这个插件作者的帖子&#xff0c;有兴趣的可以…

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令&#xff0c;查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig&#xff1a; 2.安装SSH&#xff08;加密远程登录协议&#xff09; (1).安装OpenSSH服务器软件包&#xff1a; sudo apt-get install openssh-ser…

【惊艳视界】Perfectly Clear Workbench:让您的图像瞬间焕发生机!

在数字化时代&#xff0c;图像已成为我们生活中不可或缺的一部分。无论是摄影爱好者&#xff0c;还是专业设计师&#xff0c;都渴望拥有一款能够轻松提升图像质量的神奇工具。今天&#xff0c;我们为您带来了一款图像清晰处理软件的佼佼者——Perfectly Clear Workbench&#x…

最新!!2024上半年软考【高级】系统分析师 综合知识真题解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的系统分析师选择题真题及答案&#xff0c;总共30道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&…

【全开源】知识付费问答社区(FastAdmin+ThinkPHP)

此系统是一款基于FastAdmin和ThinkPHP开发的知识付费问答社区系统&#xff0c;提供全部前后台无加密源代码&#xff0c;拥有强大的付费提问、付费阅读、付费查看、付费邀请、全文搜索等功能模块&#xff0c;其整合了强大的标签模块和专区模块&#xff0c;让问题和文章更好的归类…

python办公自动化——(三)替换PPT文档中图形数据-折线图

数据替换前 数据替换后 代码实现 # 单折线 pathE:\\13 python 下侧双x轴折线图\\ prs Presentation(path双x轴测试-01.pptx) data_timepd.read_excel(path"数据.xlsx",sheet_name单折线)ppt_9prs.slides…

初学JavaScript

什么是JavaScrip&#xff1a; JavaScript 是一种高级编程语言&#xff0c;主要用于网页开发。它是一种动态、弱类型的语言&#xff0c;可以在客户端&#xff08;浏览器&#xff09;中运行&#xff0c;并与 HTML 和 CSS 一起用于创建交互式网页。JavaScript 可以添加动态功能&a…

电脑误删除的文件怎么恢复?6个方法图文详解!

“我在电脑上误删除了一些比较重要的文件&#xff0c;现在不知道应该怎么操作了&#xff0c;有没有可以分享一下经验的朋友呀&#xff1f;” 在数字化世界的浪潮中&#xff0c;电脑成为了我们处理、存储和分享信息的重要工具。然而&#xff0c;随着我们对电脑的依赖日益加深&am…

【云原生】kubernetes中Configmap原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

236. 二叉树的最近公共祖先(C++)

文章目录 前言一、题目介绍二、解决方案三、优化总结 前言 在本篇文章中我们将会讲解二叉树中极为经典的题目236. 二叉树的最近公共祖先 一、题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的…

如何借VR之手,让展厅互动更精彩?

VR虚拟现实技术以其卓越的沉浸式体验为特点&#xff0c;引领用户踏入一个全新的虚拟世界&#xff0c;正因如此&#xff0c;它开始被广泛应用于展厅、商业等多个领域。那么&#xff0c;今天&#xff0c;让我们就来了解一下这种技术是如何为展厅带来精彩互动体验的吧&#xff01;…

日常使用工具(截图,笔记,一键启动)

目录 一,截图 Snipaste 二.笔记 Joplin 三.翻译 四.自动启动软件 这篇记录一下工作中用的很顺手的工具. 一,截图 Snipaste 官网:Snipaste - 截图 贴图 下面是官方手册. 使用 我都是直接F1 就会出现选择框,随意拖动大小,选择下方工具栏,相应位置, 二.笔记 Joplin 官网:…

el-table表格实现鼠标拖动而左右滑动

场景描述&#xff1a; 表格样式较为复杂&#xff0c;10条数据超出整个屏幕的高度&#xff0c;因而导致无法快速拖动滚动条&#xff0c;所以提出需要在表格内容区拖动鼠标&#xff0c;从而实现无需滚动到底部就可以左右拖动表格内容的效果。 具体实现&#xff1a; 实现的方式…

[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆? 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09; 注:优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。 在堆的树形结构中&#xff0c…