当前位置: 首页 > news >正文

java 异常-Exception

异常的概念

Java 语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两大类
(1)Error(错误):Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。比如:StackOverflowError【栈溢出】和 OOM【out of memory】,Error 是严重错误,程序会崩溃。
(2)Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问,试图读取不存在的文件,网络连接中断等等
Exception 分为两大类:
运行时异常:程序运行时,发生的异常
编译时异常:编程时,编译器检查出的异常。

异常体系图

异常体系图的小结

  1. 异常分为两大类,运行时异常和编译时异常.
  2. 运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException 类及它的子类都是运行时异常。
  3. 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程多的可读性和运行效率产生影响。
  4. 编译时异常,是编译器要求必须处置的异常。

常见的运行时异常

常见的运行时异常包括

  • 1) NullPointerException 空指针异常
  • 2) ArithmeticException 数学运算异常
  • 3) ArrayIndexOutOfBoundsException 数组下标越界异常
  • 4) ClassCastException 类型转换异常
  • 5) NumberFormatException 数字格式不正确异常[]
常见的运行时异常举例
1) NullPointerException 空指针异常 NullPointerException_.java

当应用程序试图在需要对象的地方使用 null 时,抛出该异常,看案例演示。

public class NullPointerException_ {public static void main(String[] args) {String name = null;System.out.println(name.length());}
}
2) ArithmeticException数学运算异常ArithmeticException_.java

当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例,案例演示

public class NumberFormatException_ {public static void main(String[] args) {String name = "你好,世界";//将String 转成 intint num = Integer.parseInt(name);//抛出NumberFormatExceptionSystem.out.println(num);//1234}
}
3) ArrayIndexOutOfBoundsException数组下标越界异常

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引

public class ArrayIndexOutOfBoundsException_ {public static void main(String[] args) {int[] arr = {1,2,4};for (int i = 0; i <= arr.length; i++) {System.out.println(arr[i]);}}
}
4) ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个ClassCastException

public class ClassCastException_ {public static void main(String[] args) {A b = new B(); //向上转型B b2 = (B)b;//向下转型,这里是OKC c2 = (C)b;//这里抛出ClassCastException}
}
class A {}
class B extends A {}
class C extends A {}
5) NumberFormatException数字格式不正确异常

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常=>使用异常我们 可以确保输入是满足条件数字.

public class NumberFormatException_ {public static void main(String[] args) {String name = "快快乐乐学java";//将String 转成 intint num = Integer.parseInt(name);//抛出NumberFormatExceptionSystem.out.println(num);//1234}
}

编译异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常

(1)SQLException:操作数据库时,查询表可能发生异常
(2)IOException:操作文件时,发生的异常
(3)FileNotFoundException:当操作一个不存在的文件时,发生异常
(4)EOFException:操作文件,到文件未尾,发生异常
(5)IllegalArguementException:参数异常

异常处理

异常处理的方式:

  • (1)try-catch-finally:程序员在代码中捕获发生的异常,自行处理。
  • (2)throws:将发生的异常抛出,给调用者(方法)来处理,最顶级的处理者就是 JVM

示意图

try-catch-finally

throws

try-catch 异常处理

(1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块。
(2)如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch。
(3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用 finally。
(4)可以有多个 catch 语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception 在后,NullPointerException 在前),如果发生异常,只会匹配一个 catch 。
(5)可以进行 try-finally 配合使用,这种用法 相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

public class TryCatchDetail {public static void main(String[] args) {//ctrl + atl + t//解读//1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块//2. 如果异常没有发生,则顺序执行try的代码块,不会进入到catch//3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finallytry {String str = "世界你好";int a = Integer.parseInt(str);System.out.println("数字:" + a);} catch (NumberFormatException e) {System.out.println("异常信息=" + e.getMessage());} finally {System.out.println("finally代码块被执行...");}System.out.println("程序继续...");}
}
public class TryCatchDetail02 {public static void main(String[] args) {//解读//1.如果try代码块有可能有多个异常//2.可以使用多个catch 分别捕获不同的异常,相应处理//3.要求子类异常写在前面,父类异常写在后面try {Person person = new Person();//person = null;System.out.println(person.getName());//NullPointerExceptionint n1 = 10;int n2 = 0;int res = n1 / n2;//ArithmeticException} catch (NullPointerException e) {System.out.println("空指针异常=" + e.getMessage());} catch (ArithmeticException e) {System.out.println("算术异常=" + e.getMessage());} catch (Exception e) {System.out.println(e.getMessage());} finally {}}
}
class Person {private String name = "jack";public String getName() {return name;}
}
public class TryCatchDetail03 {public static void main(String[] args) {/*可以进行 try-finally 配合使用, 这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑*/try{int n1 = 10;int n2 = 0;System.out.println(n1 / n2);}finally {System.out.println("执行了finally..");}System.out.println("程序继续执行..");}
}

try-catch-finally 执行顺序小结

  • 1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执
  • 2)行catch块中的语句,如果有finally,最后还需要执行finally里面的语句

throws

(1)如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
(2)在方法声明中用 throws 语句可以声明抛出异常的列表,throws 后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

注意事项和使用细节:
(1)对于编译异常,程序中必须处理,比如 try-catch 或者 throws。
(2)对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理。
(3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型。
(4)在throws 过程中,如果有方法 try-catch,就相当于处理异常,就可以不必throws

import java.io.FileInputStream;
import java.io.FileNotFoundException;public class ThrowsDetail {public static void main(String[] args) {f2();}public static void f2() /*throws ArithmeticException*/ {//1.对于编译异常,程序中必须处理,比如 try-catch 或者 throws//2.对于运行时异常,程序中如果没有处理,默认就是throws的方式处理int n1 = 10;int n2 = 0;double res = n1 / n2;}public static void f1() throws FileNotFoundException {//这里大家思考问题 调用f3() 报错//解读//1. 因为f3() 方法抛出的是一个编译异常//2. 即这时,就要f1() 必须处理这个编译异常//3. 在f1() 中,要么 try-catch-finally ,或者继续throws 这个编译异常f3(); // 抛出异常}public static void f3() throws FileNotFoundException {FileInputStream fis = new FileInputStream("d://aa.txt");}public static void f4() {//解读://1. 在f4()中调用方法f5() 是OK//2. 原因是f5() 抛出的是运行异常//3. 而java中,并不要求程序员显示处理,因为有默认处理机制f5();}public static void f5() throws ArithmeticException {}
}class Father { //父类public void method() throws RuntimeException {}
}class Son extends Father {//子类//3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,//   所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型//4. 在throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必throws@Overridepublic void method() throws ArithmeticException {}
}

自定义异常

当程序中出现了某些“错误”,但该错误信息并没有在 Throwable 子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

自定义异常的步骤

(1)定义类:自定义异常类名,继承 Exception 或 RuntimeException。
(2)如果继承 Exception,属于编译异常。
(3)如果继承 RuntimeException,属于运行异常(一般来说继承 RuntimeException)。

自定义异常的应用实例

CustomException.java

当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常(要求 继承RuntimeException),并给出提示信息。

public class CustomException {public static void main(String[] args) /*throws AgeException*/ {int age = 180;//要求范围在 18 – 120 之间,否则抛出一个自定义异常if(!(age >= 18 && age <= 120)) {//这里我们可以通过构造器,设置信息throw new AgeException("年龄需要在 18~120之间");}System.out.println("你的年龄范围正确.");}
}
//自定义一个异常
//解读
//1. 一般情况下,我们自定义异常是继承 RuntimeException
//2. 即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制
//3. 即比较方便
class AgeException extends RuntimeException {public AgeException(String message) {//构造器super(message);}
}

throw 和 throws 的区别

相关文章:

java 异常-Exception

异常的概念 Java 语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 执行过程中所发生的异常事件可分为两大类 &#xff08;1&#xff09;Error&#xff08;错误&#xff09;&#xff1a;Java 虚…...

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/128600583 https://blog.csdn.net/weixin_…...

IO流体系(FiletOutputStream)

书写步骤&#xff1a; 1.创建字节输出流对象 细节1:参数是字符串表示的路径或者是File对象都是可以的 细节2:如果文件不存在会创建一个新的文件&#xff0c;但是要保证父级路径是存在的。 细节3:如果文件已经存在&#xff0c;则会清空文件 2.写数据 细节:write方法的参数…...

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…...

CSS——网格布局(display: grid)之下篇

CSS——网格布局&#xff08;display: grid&#xff09;之下篇 前面我们介绍了网格布局的基础的创建以及一些比较基础的属性&#xff0c;下面我们将介绍网格布局的剩余部分&#xff0c;还将结合实例来进行细致的讲解&#xff08;图文并茂&#xff0c;生动形象有内涵&#xff0…...

低势期操作

《周易》讲事务发展有六个阶段&#xff1a; 第一阶段&#xff1a;潜龙勿用。 第二阶段&#xff1a;见龙在田。 第三阶段&#xff1a;终日乾乾。 第四阶段&#xff1a;或跃在渊。 第五阶段&#xff1a;飞龙在天。 第六阶段&#xff1a;亢龙有悔。 现在大环境不好&#xff…...

IMS 呼叫流程(详细)

目录 业务模型 典型组网如图1所示 信令流程 具体的语音流程如图2所示 主叫信令面流程 01:UE_A->P-CSCF/ATCF 02:P-CSCF/ATCF_A->PCRF_A 03:PCRF_A->PCSCF/ATCF_A 04:P-CSCF/ATCF_A 处理(把S-CSCF加到Route) 05:S-CSCF_A->MMTel AS/SCC AS_A 06:MM…...

系统架构设计师:系统架构设计

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:系统架构设计前言软件架构设计与生命周期SA 实现阶段主要关注的内容A…...

win11不显示已经打开的窗口

...

数学建模常用模型全面总结(含适用条件、优点、局限性和应用场景)

目录 1. 代数模型&#xff08;Algebraic Models&#xff09;2. 微分方程模型&#xff08;Differential Equation Models&#xff09;3. 概率模型&#xff08;Probabilistic Models&#xff09;4. 优化模型&#xff08;Optimization Models&#xff09;5. 统计模型&#xff08;S…...

RabbitMQ消费者确认和重复机制

消费者确认机制 为了确认消费者是否成功处理消息&#xff0c;RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#xff0c;应该向RabbitMQ发送一个回执&#xff0c;告知RabbitMQ自己消息处理状态。回执…...

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77

编写乘法器求解算法表达式 描述 编写一个4bit乘法器模块&#xff0c;并例化该乘法器求解c12*a5*b&#xff0c;其中输入信号a,b为4bit无符号数&#xff0c;c为输出。注意请不要直接使用*符号实现乘法功能。 模块的信号接口图如下&#xff1a; 要求使用Verilog HDL语言实现以上…...

thinkPHP 8.0.4 安装

windows 上安装最新版 thinkPHP8.0.4 下载phpStudy V8.1&#xff1a;小皮面板安装Composer2.x&#xff0c;Composer是PHP的一个依赖管理工具&#xff0c;主要功能包括依赖管理、版本控制、自动加载、扩展开发以及集成其他工具。安装 php8.0.2 4. 网站-管理-compose&#xff0c…...

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

ingress是一个API资源。 其核心作用是nginx网页服务器。 当客户端访问服务器不同的url时, 用不同的location提供服务。 在k8s之外&#xff0c;nginx的配置一般如下&#xff1a; http {server {listen 80;server_name localhost;location / {root html; …...

寄存器二分频电路

verilog代码 module div2_clk ( input clk, input rst,output clk_div);reg clk_div_r; assign clk_div clk_div_r;always(posedge clk) beginif(rst)beginclk_div_r < 1b0;endelsebeginclk_di…...

Kafka3.8.0+Centos7.9的安装参考

Kafka3.8.0Centos7.9的安装参考 环境准备 操作系统版本&#xff1a;centos7.9 用户/密码&#xff1a;root/1qazXSW 主机名 IP地址 安装软件 下载地址 k1 192.168.207.131 jdk1.8zookeeper3.9.2kafka_2.13-3.8.0efak-web-3.0.1 1&#xff09; Java Downloads | Oracle …...

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上&#xff0c;所以Redis性能高。 但是当重启的时候&#xff0c;或者因为特殊情况导致Redis崩了&#xff0c;就可能导致数据的丢失。 所以Redis采取了持久化的机制&#xff0c;重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…...

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…...

SpringCloud的学习(三),Resilience4j

CircuitBreaker断路器 “断路器”本身是一种开关装置&#xff0c;当某个服务单元发生故障之后&#xff0c;通过断路器的故障监控&#xff08;类似熔断保险丝&#xff09;&#xff0c;向调用方返回一个符合预期的、可处理的备选响应(FallBack)&#xff0c;而不是长时间的等待或…...

【计算机网络篇】计算机网络概述

本文主要介绍计算机网络第一章节的内容&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.计算机网络的组成 ✨主要内容 1.边缘部…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...