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 的区别

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[Python]案例驱动最佳入门:股票分析 Python数据分析与可视化实战

在股票市场中&#xff0c;价格波动和投资决策紧密相连。通过数据分析&#xff0c;投资者可以识别市场趋势、价格波动背后的规律&#xff0c;并做出明智的投资决策。Python凭借其强大的数据处理和可视化功能&#xff0c;在金融市场分析中被广泛应用。本文将通过一个假设的股票市…

MySQL基础基础篇 - SQL

01 SQL通用语法 02 SQL分类 03 DDL语句 04 DML语句 05 DQL语句(单表查询) 05_01 学习总览 05_02 基本查询 05_03 条件查询 【应用实例】&#xff1a; 05_04 聚合函数 05_05 分组查询 05_06 排序查询 05_07 分页查询 【boss题目】&#xff1a; 05_08 执行顺序 06 DCL语句 【概…

如何设计出一个比较全面的测试用例

目录 1. 测试用例的基本要素(不需要执行结果) 2. 测试用例的给我们带来的好处 3. 用例编写步骤 4. 设计测试用例的方法 4.1 基于需求进行测试用例的设计 4.2 具体的设计方法 1.等价类 2.边界值 3.判定表&#xff08;因果图&#xff09; 4.正交表法 5.场景设计法 6.错误猜测…

JavaSE——String类

一、字符串构造 注意&#xff1a;String是引用类型&#xff0c;内部并不存储字符串本身。 有三种方式&#xff1a; public class Test1 {public static void main(String[] args) {// 使用常量串构造String s1 "hello java";System.out.println(s1);// 直接newSt…

20240921全国计算机二级Python考试(大头博士计算二级)

一、背景需求&#xff1a; 20240921我在上海应用技术大学44号楼考场参加2024年9月的全国计算机二级&#xff08;Python语言程序设计&#xff09;考试。 时隔多年&#xff0c;再次来到大学校园&#xff0c;恍若隔世 扫码找考场在哪里 考场须知 1、进考场&#xff0c;先刷身份证…

局域网内远程桌面怎么设置?3个远程桌面2个小技巧搞定!

在局域网内设置远程桌面&#xff0c;主要可以通过Windows系统自带的远程桌面功能来实现。 同时也可以借助一些专业的远程桌面软件来增强功能和安全性。 以下是详细的设置步骤及两个小技巧&#xff1a; 一、Windows系统自带远程桌面设置 1.启用远程桌面 在被控制的电脑上&am…

剑指offer JZ54 二叉搜索树的第k个节点

描述&#xff1a; 给定一棵结点数为n 二叉搜索树&#xff0c;请找出其中的第 k 小的TreeNode结点值。 1.返回第k小的节点值即可 2.不能查找的情况&#xff0c;如二叉树为空&#xff0c;则返回-1&#xff0c;或者k大于n等等&#xff0c;也返回-1 3.保证n个节点的值不一样 如…

李宏毅机器学习2023HW12—Reinforcement Learning强化学习

文章目录 TaskBaselineSimpleMedium Baseline—Policy GradientStrong Baseline——Actor-CriticBoss Baseline—Mask Task 实现深度强化学习方法: Policy GradientActor-Critic 环境&#xff1a;月球着陆器 Baseline Simple 定义优势函数(Advantage function)为执行完ac…

C++之Person类

首先设置头文件&#xff0c;将题目中的要求完成。 #include <iostream>using namespace std;class Person { public:Person();Person(string name, int id, string address);~Person();void setPerson(string name, int id, string address);void setName(string name);…

Kotlin编程全攻略:从基础到实战项目的系统学习资料

Kotlin作为一种现代、简洁的编程语言&#xff0c;正逐渐成为Android开发的新宠。本文将为您介绍一套全面的Kotlin学习资料&#xff0c;包括学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;帮助您从Kotlin的基础语法到实战项目开发&#xff0c;系统地提升您的编程技能。…

2024年中国研究生数学建模竞赛B题(华为题目)WLAN组网中网络吞吐量建模一

2024年中国研究生数学建模竞赛B题&#xff08;华为题目&#xff09; WLAN组网中网络吞吐量建模 一、背景 无线局域网&#xff08;Wireless Local Area Network&#xff0c;WLAN&#xff09;是一种无线计算机网络&#xff0c;使用无线信道作为传输介质连接两个或多个设备。WL…

什么情况下会导致索引失效?

什么情况下会导致索引失效&#xff1f; 1. 组合索引非最左前缀2. LIKE查询%开头3. 字符串未加引号4. 不等比较5. 索引列运算6. OR连接查询 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 组合索引非最左前缀 描述&#xff1a;在组合索引…

Linux之实战命令02:shred应用实例(三十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

python sql中带引号字符串(单双引号)转义处理

描述&#xff1a; 最近在爬取数据保存到数据库时&#xff0c;遇到有引号的字符串插入MySQL报错&#xff1a;1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 转义字符串…

【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍

最近在整理之前的一些实践工作&#xff0c;一方面是为了笔记记录&#xff0c;另一方面也是自己做一些温故知新&#xff0c;或许对于理解一些现在大模型工作也有助益。 1. 基于bert模型实现中文语句的embedding编码 首先是基于bert模型实现中文语句的embedding编码&#xff0c;…

828华为云征文|Flexus X实例GitLab部署构建流水线-私人一体化代码仓库~

目录 前言Gitlab 环境准备 GitLab部署 拉取GitLab镜像 创建映射目录 运行GitLab容器 修改gitlab.rb配置 开放端口 切换语言 创建项目 添加ssh密钥 克隆代码 CICD 什么是CICD Gitlab中使用CICD 什么是Runner 安装GitLab Runner 获取注册令牌 runner注册 交互…

2024华为杯数学建模竞赛E题

2024年中国研究生数学建模竞赛E题 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&…

8-Python基础编程之数据类型操作——字典和集合

Python基础编程之数据类型操作——字典和集合 字典概念定义意义操作增删改查遍历计算和判定 集合概念定义可变集合不可变集合 操作单一集合操作增删查 集合之间操作交集并集差值判定 字典 概念 无序的&#xff0c;可变的键值对的集合 定义 方式一直接定义&#xff1a; per…

Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架

简介&#xff1a; Spring注解定时任务使用不是很灵活&#xff0c;如果想要灵活的配置定时任务&#xff0c;可以使用xxl-job 或者 quartz等定时任务框架&#xff0c;但是过于繁琐&#xff0c;可能成本较大。所以可以使用ThreadPoolTaskScheduler来灵活处理定时任务 ThreadPoolT…

2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑+dfs

2024 ICPC ShaanXi Provincial Contest —— C. Seats&#xff08;个人理解&#xff09;拓扑dfs 先放个传送门 https://codeforces.com/gym/105257/problem/C ———————————————————————————————————— 思路 可以看到&#xff0c;每一个编…