【Java基础】Java中异常分类,他们之间的区别?

在这里插入图片描述

🍁Java中异常分哪两类

  • 🍁Java中异常类
    • 🍁受检异常
    • 🍁非受检异常
  • 🍁拓展知识仓
    • 🍁什么是Throwable
    • 🍁Error和Exception的区别和联系
    • 🍁 列举几个常用的RuntimeException
    • 🍁Java异常处理相关的几个关键字,以及简单用法
    • 🍁什么是自定义异常,如何使用自定义异常?


🍁Java中异常类


Java中的异常,主要可以分为两大类,即受检异常 (checked exception)和非受检异常 (unchecked exception)。


🍁受检异常


对于受检异常来说,如果一个方法在声明的过程中证明了其要有受检异常抛出:


public void test() throws Exception{
}


那么,当我们在程序中调用他的时候,一定要对该异常进行处理(捕获或者向上抛出),否则是无法编译通过的这是一种强制规范。


这种异常在 IO 操作中比较多。比如FileNotFoundException ,当我们使用 IO 流处理一个文件的时候,有一种特殊情况,就是文件不存在,所以,在文件处理的接口定义时他会显示抛出 FileNotFoundException,其目的就是告诉这个方法的调用者,我这个方法不保证一定可以成功,是有可能找不到对应的文件的,你要明确的对这种情况做特殊处理。


所以说,当我们希望我们的方法调用者,明确的处理一些特殊情况的时候,就应该使用受检异常。


看一段受检异常的demo:


import java.io.File;  
import java.io.FileNotFoundException;  
import java.util.Scanner;  public class Main {  public static void main(String[] args) {  try {  // 尝试打开文件  File myFile = new File("myFile.txt");  Scanner myReader = new Scanner(myFile);  // 读取文件内容  while (myReader.hasNextLine()) {  String line = myReader.nextLine();  System.out.println(line);  }  // 关闭文件  myReader.close();  } catch (FileNotFoundException e) {  // 处理文件未找到异常  System.out.println("An error occurred: File not found.");  e.printStackTrace();  } catch (Exception e) {  // 处理其他异常  System.out.println("An error occurred: " + e.getMessage());  e.printStackTrace();  } finally {  // 确保文件被关闭,无论是否发生异常  try {  if (myReader != null) {  myReader.close();  }  } catch (Exception e) {  System.out.println("An error occurred while closing the file.");  e.printStackTrace();  }  }  }  
}

在这个例子中,我们尝试打开一个文件并读取其内容。如果文件不存在,我们会捕获 FileNotFoundException 异常并打印出错误消息和堆栈跟踪。我们还添加了一个 finally 块来确保文件在程序结束时被关闭,无论是否发生异常。如果在关闭文件时发生异常,我们也会捕获并打印它。


🍁非受检异常


对于非受检异常来说,一般是运行时异常,继承自 RuntimeException。在编写代码的时候,不需要显示的捕获但是如果不捕获,在运行期如果发生异常就会中断程序的执行。


这种异常一般可以理解为是代码原因导致的。比如发生空指针、数组越界等。所以,只要代码写的没问题,这些异常都是可以避免的。也就不需要我们显示的进行外理。


试想一下,如果你要对所有可能发生空指针的地方做异常处理的话,那相当于你的所有代码都需要做这件事。看一个Demo:


public class Main {  public static void main(String[] args) {  try {  // 尝试执行可能抛出非受检异常的代码  int[] arr = new int[5];  arr[10] = 100; // 数组越界异常  // 尝试进行除法运算,可能会抛出除以零异常  int result = 10 / 0;  // 尝试访问一个不存在的数组元素,可能会抛出数组越界异常  System.out.println(arr[15]);  } catch (Exception e) {  // 捕获所有类型的异常并处理  System.out.println("An error occurred: " + e.getMessage());  e.printStackTrace();  } finally {  // 在程序结束前执行的代码,确保资源被正确释放  System.out.println("Cleaning up resources...");  }  }  
}

Demo中,尝试执行可能会抛出非受检异常的代码。我们执行了一个数组越界操作和除以零操作,以及访问一个不存在的数组元素。在 catch 块中,我们捕获了所有类型的异常并打印出错误消息和堆栈跟踪。我们还添加了一个 finally 块来确保在程序结束前执行一些清理操作。


🍁拓展知识仓

🍁什么是Throwable


在Java中,Throwable 是一个所有异常和错误的超级类。异常和错误都是可以抛出(throw)的异常对象,可以被捕获(catch)并处理。Throwable 包含两个主要子类:ExceptionError

  • Exception:这是程序运行期间可能出现的异常的超类。大多数运行时异常都是从 Exception 类派生的。
  • Error:这是程序无法处理的严重问题,如 OutOfMemoryErrorStackOverflowError

以下是一个简单的Java代码示例,演示了如何使用 Throwable

public class ThrowableExample {public static void main(String[] args) {try {// 抛出一个异常throw new Exception("This is an exception.");} catch (Exception e) {// 捕获并处理异常System.out.println("Caught an exception: " + e.getMessage());}}
}

在这个例子中,我们创建了一个新的 Exception 对象并抛出它。然后,我们使用 try-catch 块捕获并处理这个异常。这个异常对象就是 Throwable 类型的实例。我们可以通过调用 getMessage() 方法获取异常的详细信息。


🍁Error和Exception的区别和联系


error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。如OutOfMemoryError、StackOverflowError这两种常见的错误都是ERROR。


exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须外理的问题.分为RuntimeException和其他异常。


🍁 列举几个常用的RuntimeException


这个题目,其实面试官考的还挺多的,主要是考察面试者实战经验是否丰富,所以常见的RuntimeException要能回答的尽量多回答一些:


在这里插入图片描述

🍁Java异常处理相关的几个关键字,以及简单用法


throws、 throw、try、catch、 finally


1.try用来指定一块预防所有异常的程序
2.catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型
3.finally为确保一段代码不管发生什么异常状况都要被执行
4.throw语句用来明确地抛出一个异常
5.throws用来声明一个方法可能抛出的各种异常

🍁什么是自定义异常,如何使用自定义异常?


自定义异常就是开发人员自己定义的异常,一般通过继承Exception的子类的方式实现。


编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。


这种用法在Web开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。

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

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

相关文章

关于“Python”的核心知识点整理大全41

目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py 我们将最高得分圆整…

微信这样分类客户,帮你轻松提升业绩!

无论是什么行业,都会遇到各种各样的客户,能不能成交这些客户,关键的一点在于有没有明确的客户分类。 今天就给大家分享几个高效分类客户的方法,帮助大家提高成交率和业绩。 1、分组管理 在微信中创建不同的分组,比如…

MyBatis——MyBatis的缓存

MyBatis的缓存 创建工程: 1缓存介绍 为什么使用缓存? 首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少IO、硬盘读写次数、提高效率 Mybatis中的一级缓存和二级缓存?…

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【JavaScript】Set、Map、WeakSet、WeakMap

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

Gin框架之使用 go-ini 加载.ini 配置文件

首先,联想一个问题,我们在部署服务时,通常为了方便,对于需要迭代更新的代码进行修改,但是比对shell,可以搞一个变量将需要修改的,以及修改起来变动处多的,写在变量内,到时候如果需要变更,可以直接变更变量即可; 那么,golang有没有什么方式可以将需要变的东西保存起…

TCP协议及工作原理(三)客户端的搭建

ui界面的搭建 : QTcpServer是基于TCP的服务器类提供一种方便的方式管理和创建TCP服务器,QTcpSocket处理TCP套接字编程用于建立TCP连接,发送接收数据等功能。 参考前两篇可深入理解!!!!&#xff…

php 不加后缀访问

实现不带后缀访问php文件的方法:首先在htaccess文件中加入内容“RewriteRule ^(api/token) token.php [L]”;然后通过根目录下的“token.php”来接受“api/token”;最后修改配置文件。 考虑的做法有: HTTP重写技术,让…

Win10电脑蓝牙默认音量100的设置教程

在Win10电脑操作过程中,用户想设置连接蓝牙后音量默认是100,但不知道具体的设置操作步骤。这时候用户需要打开Win10系统上的注册表,点击修改注册表来完成这一设置,下面就是Win10电脑蓝牙默认音量100的设置教程介绍,帮助…

【Java、Python】获取电脑当前网络IP进行位置获取(附源码)

我相信看到这篇博客的时候心里肯定是想解决自己的一个问题的,而这篇博客我就以简单快速的方式解决这些烦恼! 一、获取当前IP 在Java中自带了一些自己的流对象来获取当前的IP地址,不多说我们直接上代码。 //获取当前网络ip地址 ipAddress Ine…

CentOS安装MongoDB

CentOS安装MongoDB 文章目录 CentOS安装MongoDB1. 安装并运行2. 创建用户/密码3. 测试语句4. 允许外网访问 1. 安装并运行 在 CentOS 上安装 MongoDB,你可以按照以下步骤进行: 导入 MongoDB 的 GPG 密钥: sudo rpm --import https://www.mon…

React快速入门之组件

组件 文件&#xff1a;Profile.js export default function Profile({isPacked true&#xff0c;head,stlyeTmp,src,size 80}) {if (isPacked) {head head " ✔";}return (<div><h1>{head}</h1><imgsrc{src}alt"Katherine Johnson&q…

MongoDB ReplicaSet 部署

文章目录 前言1. 环境准备2. 生成密钥3. 配置参数4. 创建 ReplicaSet5. 副本集维护5.1 新增成员5.2 移除节点5.4 主节点降级5.5 阻止选举5.6 允许副本节点读5.7 延迟观测 6. 连接副本集 后记 前言 本篇文章介绍 MongoDB ReplicaSet 如何搭建&#xff0c;及常用的维护方法。 1…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

【Jmeter】Jmeter基础9-BeanShell介绍

3、BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。 3.1、Jmeter中使用的BeanShell 在Jmeter中&#xff0c;除了配置元件&#xff0c;其他类型的元件中都有BeanShell。BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥…

TCP并发服务器

一.进程实现TCP并发服务器 #include <func.h> #define PORT 6666 #define IP "192.168.124.42"void handler(int arm) {while(waitpid(-1,NULL,WNOHANG) > 0); } int main(int argc, const char *argv[]) {//接受17号信号signal(17, handler);i…

Matlab之State Flow

打开方式 方式一&#xff1a;在命令窗口输入State Flow或者简写sf就能打开&#xff0c;并且会自动打开State Flow 的Library。从左到右分别是图表、真值表、状态转换表、例子、顺序查看&#xff0c;可以加入到Simulink当中。 方式二&#xff1a;从Simulink Library里面添加Sta…

EB tresos 配置I2c - 实现与PF8200的读写操作

文章目录 前言一、EB工具链配置1、I2c模块1&#xff09;新建模块2&#xff09;配置General3&#xff09;配置I2cChannel 2、Port模块1&#xff09;配置SDA2&#xff09;配置SCL 二、代码分析1、申明一个I2c配置结构体数组&#xff0c;用于I2c所有读操作。2、搭建读操作函数 三、…

得物大模型平台,业务效果提升实践

一、背景 得物大模型训练与推理平台上线几个月后&#xff0c;我们与公司内部超过 10 个业务领域展开了全面的合作。在一些关键业务指标方面&#xff0c;取得了显著的成效&#xff0c;例如&#xff1a; 效率相关部门的合作&#xff0c;多维度打标总正确率取得 2 倍以上提升。利…

Spring中的上下文工具你写的可能有bug

文章目录 前言功能第一种&#xff1a;ApplicationContext第二种方式&#xff1a;ApplicationContextAware第三种&#xff1a;BeanFactoryPostProcessor 源码第一种第二种第三种 前言 本篇是针对如何写一个比较好的spring工具的一个探讨。 功能 下面三种方式&#xff0c;你觉…