java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述

1、java程序员在编写程序时提前编写好对异常的处理程序,在程序发生异常时就可以执行预先设定好的处理程序,处理程序执行完之后,可以继续向后执行后面的程序

2、异常处理程序是在程序执行出现异常时才执行的

二、5个关键字

1、try代码块,执行可能出现异常的代码

2、catch代码块,捕获类型匹配的异常对象并执行异常处理代码

3、finally代码块,里面包含的是必须要执行的代码

4、throws,定义一个方法时可以使用throws关键字声明,表示此方法不处理异常,而是就交给方法调用处进行处理

三、使用try和catch

try(异常类型 引用名){

 异常处理代码

}

1、典例一

public static void main(String[] args) {try {// 可能会出现异常的代码int a=1;int b=0;int c=a/b;}catch (ArithmeticException e){// 异常类型 异常类型的引用变量名System.out.println("除数不能为0");// 异常处理代码}System.out.println("后面的程序");}

2、典例二:try代码块中出现异常的那一行程序后面的程序不会再被执行

public static void main(String[] args) {try {// 可能会出现异常的代码int a=1;int b=0;int c=a/b;String s="我爱吃西瓜";System.out.println(s);}catch (ArithmeticException e){// 异常类型 异常类型的引用变量名System.out.println("除数不能为0");// 异常处理代码}System.out.println("后面的程序");}

3、典例三: try代码块中如果可能出现多个异常则使用多个catch代码块去处理处理异常

public static void main(String[] args) {try {// 可能会出现异常的代码int a=1;int b=1;int c=a/b;String s=null;System.out.println(s.length());System.out.println("我爱吃西瓜");}catch (ArithmeticException e){// 异常类型 异常类型的引用变量名System.out.println("除数不能为0");// 异常处理代码}catch (NullPointerException e){System.out.println("字符串引用变量的值不能为null");}System.out.println("后面的程序");}

4、典例四: try代码块中如果不清楚会出现什么异常可以使用Exception作为异常类型去捕捉异常对象

 public static void main(String[] args) {try {// 可能会出现异常的代码int a=1;int b=1;int c=a/b;String s=null;System.out.println(s.length());System.out.println("我爱吃西瓜");}catch (ArithmeticException e){// 异常类型 异常类型的引用变量名System.out.println("除数不能为0");// 异常处理代码}catch (Exception e){e.printStackTrace();// 输出异常类型和异常位置System.out.println("程序异常:"+e.getMessage());// 打印异常原因}System.out.println("后面的程序");}

注意:捕捉父类异常的cath代码块必须放在捕捉子类异常的catch代码块之前

四、使用finally

finally代码块中都是一些必须要执行的代码

finally{

     必须要执行的代码

}

1、典例一:应用场景(catch代码块中可能会出现异常)

try {// 可能会出现异常的代码int a=1;int b=0;int c=a/b;System.out.println("我爱吃西瓜");}catch (ArithmeticException e){// 异常类型 异常类型的引用变量名String s=null;System.out.println(s.length());System.out.println("除数不能为0");// 异常处理代码}finally {System.out.println("最终必须要执行的代码");}System.out.println("后面的代码");

2、典例二:应用场景(必须要执行且只能放在finally代码块中的代码)

public int sum() throws IOException {FileInputStream inputStream=null;try {inputStream=new FileInputStream("E:/a.txt");}catch (FileNotFoundException f){f.printStackTrace();System.out.println("没找到文件");}finally {if (inputStream!=null){inputStream.close();System.out.println("关闭流通道");}return 100;}}

3、典例三:实际应用场景(IO读取文件时必须关闭流通道)

public static void main(String[] args) throws IOException {FileInputStream inputStream=null;try {inputStream=new FileInputStream("E:/hhh.txt");// 创建流通道inputStream.read();}catch (FileNotFoundException f){f.printStackTrace();System.out.println("找不到文件");}catch (IOException i){i.printStackTrace();System.out.println("读文件出现异常");}finally {if(inputStream!=null){inputStream.close();// inputStream不为null,关闭流通道}}}

五、使用throws

public void test throws 异常1,异常2,异常3{

代码

}

1、任何方法都可以使用throws声明异常类型,包括抽象方法

2、一个方法可以声明多个异常类型

3、调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明

4、如果抛出的是运行期异常,不会有提示,需要查看所调用的方法结构

5、典例

public class Demo {public static void main(String[] args) {try {int res=divide(1,0);System.out.println(res);}catch (ArithmeticException a){a.printStackTrace();System.out.println("除数不能为0");}try {byte[]bytes=transform("abc");System.out.println(Arrays.toString(bytes));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}// 除法运算public static int divide(int a,int b)throws ArithmeticException{// ArithmeticException 运行期异常 无提示 继承了RuntimeExceptionreturn a/b;}// 字符串转为字节数组返回public  static byte[] transform(String s) throws UnsupportedEncodingException {// UnsupportedEncodingException 编译期异常 有提示 不继承RuntimeExceptionbyte[] bytes=s.getBytes("utf-8");// 指定编码格式return bytes;}
}

六、异常可以分为运行期异常和编译期异常两种

1、编译时期异常(即checked异常、受检异常):

(1)代码编译阶段,编译器就能明确当前代码可能发生XX异常

(2)并明确督促程序员提前编写处理它的的代码

(3)如果程序员没有编写对应的处理代码,编译期就会判定编译失败,从而不能生成字节码文件

(4)通常,这类异常的发生不是由程序员编写的代码引起的,例如:FileNotFoundException(文件找不到异常)

2、运行时期异常(即runtime异常、unchecked异常、非受检异常):

(1)代码编译阶段,编译器不做任何检查,无论该异常是否会发生,编译器都不会给出任何提示

(2)只有等代码运行起来并发生了XX异常,异常才能被发现

(3)通常,这类异常是由程序员的代码编写不当引起的,只要程序员编写代码稍加判断并且细心检查就可以避免

(4)java.lang.RuntimeException类及子类都是运行时异常,比如:ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常

七、使用throw

1、作用

在程序不满足某种条件时显示地抛出一个异常类的实例化对象,程序就不能继续向下执行

2、语法

throw new 异常类构造方法

如:throw new RunTimeException()

3、典例

public class Demo1 {public static void main(String[] args) {try {char res=checkScore(690);System.out.println(res);} catch (Exception e) {e.printStackTrace();System.out.println("程序异常:"+e.getMessage());}}/*给分数划登记100~90 A89~80 B79~0 C*/public static char checkScore(int score) throws Exception {if (score < 0 || score > 100) {throw new Exception("分数不合法");}if (score >= 90) {return 'A';} else if (score >= 80) {return 'B';} else {return 'C';}}
}

八、自定义异常

1、来源

(1)javaAPI中定义的标准异常类都是与语法相关的,比如索引越界异常、空指针异常

(2)但我们的程序有时候想要在不满足某种业务条件时以抛出异常的形式来做处理,此时就需要我们自定义一个与业务相关的异常类来表示,例如分数不合法异常(ScoreException)

public class ScoreException extends Exception{public ScoreException() {}public ScoreException(String message) {super(message);}
}
public class Demo1 {public static void main(String[] args) {try {char res=checkScore(690);System.out.println(res);} catch (ScoreException e) {e.printStackTrace();System.out.println("程序异常:"+e.getMessage());}}/*给分数划登记100~90 A89~80 B79~0 C*/public static char checkScore(int score) throws ScoreException {if (score < 0 || score > 100) {throw new ScoreException("分数不合法");}if (score >= 90) {return 'A';} else if (score >= 80) {return 'B';} else {return 'C';}}
}

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

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

相关文章

在CentOS 7.9上安装和配置mitmproxy的详细步骤

以下是在CentOS 7.9上安装和配置mitmproxy的详细步骤&#xff1a; 更新系统&#xff1a;首先&#xff0c;打开终端并运行以下命令来更新您的系统&#xff1a; sudo yum update这将确保所有的包都是最新的。 安装Python和pip&#xff1a;mitmproxy需要Python 3.6或更高版本。Ce…

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

2024真机项目

项目需求&#xff1a; 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com 加密站点&#xff0c;该站点在任何路由可达 的主机上被访问&#xff0c;页面内容显示为 "Hello&#xff0c;Welcome to www.exam.com !"&#xff0c;并提供 content.exam.com/yum/A…

数据:人工智能的基石 | Scale AI 创始人兼 CEO 亚历山大·王的创业故事与行业洞见

引言 在人工智能领域&#xff0c;数据被誉为“新石油”&#xff0c;其重要性不言而喻。随着GPT-4的问世&#xff0c;AI技术迎来了新的浪潮。众多年轻创业者纷纷投身这一领域&#xff0c;Scale AI的创始人兼CEO亚历山大王&#xff08;Alexander Wang&#xff09;就是其中的佼佼…

什么是Java?

什么是Java&#xff1f;java是什么&#xff1f;下面我们来总结一下。 java是什么&#xff1f; java是一个静态编程语言&#xff0c;具有强大的多线程特征&#xff0c;目前java不仅采用c语言的优点&#xff0c;还去掉了一些多继承指针&#xff0c;等复杂的概念&#xff0c;我们…

Linux C/C++ 进程控制

Linux C/C 进程控制 1.信号2.进程终止3.调用可执行程序4.进程创建5.僵尸进程6.多进程与信号8.共享内存9.循环队列10. 信号量的基本概念11.多进程的生产消费者模型 1.信号 ​ 信号(signal)是软件中断&#xff0c;是进程之间相互传递消息的一种方法&#xff0c;用于通知进程发生…

回文数java算法

回文数是指从左往右读和从右往左读都一样的数字。要判断一个数字是否是回文数&#xff0c;可以将该数字转换成字符串&#xff0c;然后将字符串分割为字符数组&#xff0c;最后比较数组的对应位置的字符是否相同。 以下是一个判断回文数的Java算法&#xff1a; public static …

Git配置 安装及使用

团队开发的神 找工作必备 环境变量 配置好环境后 打开终端环境 winr cmd 我习惯在桌面打开&#xff0c;然后进入相应的文件夹 &#xff08;文件夹结构&#xff09; &#xff08;个人感觉能用cmd不用git&#xff0c;cmd更好用一些&#xff09; 进入对应的文件夹 填写自己对…

docker安装rabbitmq详解

目录 1、安装 1-1.查看rabbitmq镜像 1-2.下载Rabbitmq的镜像 1-3.创建并运行rabbitmq容器 1-4.查看启动情况 1-5.启动web客户端 1-6.访问rabbitmq的客户端 2..遇到的问题 解决方法: 1、安装 1-1.查看rabbitmq镜像 docker search rabbitmq 1-2.下载Rabbitmq的镜像 拉…

2024.6.9 五

文件区别 文本文件,又各种不同编码方式编码,导致占用空间也会不同 二进制文件,只有0和1,指定软件才能打开 操作文件步骤 先打开文件 用函数open(filename,mode,encoding) 默认打开方式是 ’ r ’ r----只读取,文件指针在文件开头,没有文件报错 w----纯覆写。如果文件存在&am…

国标GB/T 28181详解:校时流程详细说明

目录 一、定义 二、作用 1. 时间同步性 2. 事件记录的准确性 3. 跨平台、跨设备协作 4. 降低时间误差 5. 安全性提升 三、基本要求 四、命令流程 五、协议接口 六、校时效果 1、未校时的情况 2、校时后的效果 七、参考 一、定义 GB28181协议要求所有的监控设…

python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制

实现效果&#xff08;红框内&#xff09;&#xff1a; 后端api如下&#xff1a; task_api.route(/user/task/states_list, methods[POST, GET]) visitor_token_required def task_states(user):name_list [待接单, 设计中, 交付中, 已完成, 全部]data []color [#F04864, …

HOW - 接口防腐层(Anti-corruption layer)

目录 一、介绍1.1 主要概念1.2 实现方式1.3 示例 二、前端开发领域应用&#xff1a;接口不确定数据防腐层2.1 步骤和技术2.2 示例实现2.3 应用示例 一、介绍 在程序开发领域&#xff0c;防腐层&#xff08;Anti-Corruption Layer&#xff0c;ACL&#xff09;是一种架构模式&am…

CPP初阶:CPP的内存管理模式

目录 一.new和delete操作自定义类型 1.1C语言的内存管理 1.2CPP的内存管理方式 1.3C与CPP内存管理的差异 二.operator new和operator delete函数 三.CPP空间操作符使用深化 3.1 连续内存开辟与释放 3.2 非连续内存开辟与释放 四.new和delete的实现原理 4.1内置类型 4.2…

100道面试必会算法-32-二叉树右视图用栈实现队列

100道面试必会算法-32-二叉树右视图&用栈实现队列 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,n…

人机环境生态系统智能的流动性

一般来说&#xff0c;流动性可以理解为事物在空间或时间上的转移、变化或运动。在人机环境生态系统中&#xff0c;流动性可以涉及以下几个方面&#xff1a; 信息流动&#xff1a;数据、消息、知识等在系统中的传递和交换。这可能包括传感器收集的数据传输到处理中心&#xff0c…

【内网攻防实战】红日靶场(一)续篇_金票与银票

红日靶场&#xff08;一&#xff09;续篇_权限维持 前情提要当前位置执行目标 PsExec.exe拿下域控2008rdesktop 远程登录win7msf上传文件kail回连马连上win7upload上传PsExec.exe PsExec.exe把win7 带到 2008&#xff08;域控hostname&#xff1a;owa)2008开远程、关防火墙Win7…

OpenCV绘制直线

一 绘制图形 画线 画矩形 画圆 画椭圆 画多边形 绘制字体 二 画线 line(img,开始点&#xff0c;结束点&#xff0c;颜色…) 参数结束 img&#xff1a;在那个图像上画线 开始点,结束点&#xff1a;指定线的开始与结束位置&#xff1b; 颜色&#xff0c;线宽&#xff0c;线体…

java算法中枚举法是怎么运用的

在Java算法中&#xff0c;枚举法是一种通过列举所有可能性来解决问题的方法。它通常用于解决一些较为简单的问题&#xff0c;其中问题的规模较小且可能的解决方案有限。 枚举法的基本思想是列举出所有可能的解&#xff0c;然后依次检查这些解是否满足问题的要求。在Java中&…

mov指令中不允许的操作——汇编语言

在 x86 汇编语言中&#xff0c;MOV 指令的限制有助于确保系统的稳定性和正确的操作。下面详细解释为什么这些操作是不允许的。 1. 段寄存器之间直接传送数据 MOV DS, ES ; 错误&#xff0c;不允许原因&#xff1a; 段寄存器是用来定义程序段的开始位置&#xff0c;如代码段…