异常的捕获和处理

目录

一、异常

1.异常概述

1.1认识异常

1.2Java异常体系结构

2.Java异常处理机制

2.1异常处理

2.2捕获异常

2.2.1使用try-catch捕获异常

2.2.2使用try-catch-finally处理异常

2.2.3使用多重catch处理异常

2.3抛出异常

2.3.1使用throws声明抛出异常

2.3.2使用throw抛出异常

2.4自定义异常

2.5异常链


一、异常

1.异常概述

1.1认识异常

异常是指程序在运行过程中出现的非正常情况。

public class Main {public static void main(String[] args) {int i=1,j=0,res;System.out.println("begin");res=i/j;//算术运算异常System.out.println("end");}}

一旦程序发生异常将会立即结束,因此“end”没有输出。

1.2Java异常体系结构

异常在Java中被封装成了各种异常类。

程序中常见的异常: 

Exception设计时异常异常层次结构的根类
IOException设计时异常IO异常的根类,属于非运行时异常
FileNotFoundException设计时异常文件操作时,找不到文件
RuntimeException运行时异常运行时异常的根类,RuntimeException及其子类,不要求必须处理
ArithmeticException运行时异常算术运算异常
lllegalArgumentException运行时异常方法接收到非法参数
ArrayIndexOutOfBoundsException运行时异常数组越界访问异常
NullPointerException运行时异常尝试访问null对象的成员时发生的空指针异常
ArrayStoreException运行时异常数据存储异常,写数组操作时,对象或数据类型不兼容
ClassCastException运行时异常类型转换异常
IIIegalThreadStateException运行时异常试图非法改变线程状态,例如试图启动一个已经运行的线程
NumberFormatException运行时异常数据格式异常,试图把一字符串非法转换成数值

2.Java异常处理机制

2.1异常处理

Java中的异常处理机制依靠5个关键字:try、catch、finally、throw、throws。这些关键字提供了两种异常处理方式:

(1)用try、catch、finally来捕获和处理异常

try块中包含可能会抛出异常的代码

catch块中用户捕获和处理指定类型的异常

finally块中的代码无论是否发生异常都会被执行,通常用于释放资源或清理操作

(2)使用throw、throws来抛出异常

throw关键字用于手动抛出异常对象。

throws关键字用于在方法声明中指定可能抛出的异常类型,表示该方法可能会抛出该类型的异常,由调用者来处理。

2.2捕获异常
2.2.1使用try-catch捕获异常
public class Main {public static void main(String[] args) {try {int i=1,j=0,res;System.out.println("begin");res=i/j;System.out.println("end");}catch (Exception e){System.out.println("caught");e.printStackTrace();}System.out.println("over");}}
  • 如果try语句块中的所有语句正常执行完毕,没有发生异常,那么catch语句块中的所有语句将被忽略。
  • 如果try语句块在执行过程中发生异常,并且这个异常与catch语句块中声明的异常类型匹配,那么try语句块中剩下的代码都将被忽略,相应的catch语句块将会被执行。匹配是指catch中所处理的异常类型与try中发生的异常类型完全一致或者是它的父类。
  • 如果try语句块在执行过程中发生异常,而抛出的异常在catch语句块中没有被声明,那么程序立即终止运行,程序被强迫退出。
  • catch语句块中可以加入用戶自定义处理信息,也可以调用异常对象的方法输出异常信息,常用的方法如下:
    void prinStackTrace() :输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行流程,它将输出从方法调用处到异常抛出处的方法调用的栈序列。
    String getMessage() :返回异常信息描述字符串,该字符串描述了异常产生的原因,是 printStackTrace() 输出信息的一部分。
2.2.2使用try-catch-finally处理异常

无论try块中是否发生异常,finally语句块中的代码总能被执行。

public class Main {public static void main(String[] args) {try {int i=1,j=0,res;System.out.println("begin");res=i/j;System.out.println("end");}catch (ArithmeticException e){System.out.println("caught");e.printStackTrace();}finally {System.out.println("finally");}System.out.println("over");}}
  • 如果try语句块中所有语句正常执行完毕,程序不会进入catch语句块执行,但是finally语句块会被执行。 
  • 如果try语句块在执行过程中发生异常,程序会进入到catch语句块捕获异常, finally语句块也会被执行。
  • try-catch-finally结构中try语句块是必须存在的,catch、finally语句块为可选,但两者至少出现其中之一。

即使在catch语句块中存在return语句,finally语句块中的语句也会执行。发生异常时的执行顺序是,先执行catch语句块中return之前的语句,再执行finally语句块中的语句,最后执行catch语句块中的return语句退出。

finally语句块中语句不执行的唯一情况是在异常处理代码中执行了 System.exit(1) ,退出Java虚拟机。

public class Main {public static void main(String[] args) {try {int i=1,j=0,res;System.out.println("begin");res=i/j;System.out.println("end");}catch (ArithmeticException e){System.out.println("caught");e.printStackTrace();System.exit(1);}finally {System.out.println("finally");}System.out.println("over");}}

public class Main {public static void main(String[] args) {System.out.println(method());}private static int method() {int i=1;try {i++;//2System.out.println("try block,i="+i);//try block,i=2return i;//2}catch (Exception e){i++;System.out.println("catch block,i="+i);}finally {i=10;System.out.println("finally block,i="+i);//finally block,i=10}return i;}
}

 

public class Main {public static void main(String[] args) {System.out.println(method());}private static int method() {int i=1;try {i++;System.out.println("try block,i="+i);//try block,i=2return i;}catch (Exception e){i++;System.out.println("catch block,i="+i);return i;}finally {i=10;System.out.println("finally block,i="+i);//finally block,i=10return i;//10}}
}

2.2.3使用多重catch处理异常

catch语句块的排列顺序必须是从子类到父类,最后一个一般是Exception类。这是因为在异常处理中,catch语句块会按照从上到下的顺序进行匹配,系统会检测每个catch语句块处理的异常类型,并执行第一个与异常类型匹配的catch语句块。如果将父类异常放在前面,子类异常的catch语句块将永远不会被执行,因为父类异常的catch语句块已经处理了异常。

一旦系统执行了与异常类型匹配的catch语句块,并执行其中的一条catch语句后,其后的catch语句块将被忽略,程序将继续执行紧随catch语句块的代码。 

子类异常应该放在前面,父类异常应该放在后面。 

import java.util.InputMismatchException;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input=new Scanner(System.in);try {System.out.println("计算开始:");int i,j,res;System.out.println("请输入被除数:");i=input.nextInt();System.out.println("请输入除数:");j=input.nextInt();res=i/j;System.out.println(i+"/"+j+"="+res);System.out.println("计算结束");}catch (InputMismatchException e){System.out.println("除数和被除数都必须是整数!");}catch (ArithmeticException e){System.out.println("除数不能为0!");}catch (Exception e){System.out.println("其他异常"+e.getMessage());}finally {System.out.println("感谢使用本程序!");}System.out.println("程序结束!");}}

第一种:被除数发生异常

 

 第二种:除数发生异常

第三种:除数为0

2.3抛出异常
2.3.1使用throws声明抛出异常

如果在一个方法体内抛出了异常,并希望调用者能够及时地捕获异常,Java语言中通过关键字throws声明某个方法可能抛出的各种异常,以通知调用者。throws可以同时声明多个异常,之间用逗号隔开。

import java.util.InputMismatchException;
import java.util.Scanner;public class Main {public static void main(String[] args) {try {divide();}catch (InputMismatchException e){System.out.println("除数和被除数都必须是整数!");}catch (ArithmeticException e){System.out.println("除数不能为0!");}catch (Exception e){System.out.println("其他异常"+e.getMessage());}finally {System.out.println("感谢使用本程序!");}System.out.println("程序结束!");}private static void divide() throws Exception{Scanner input=new Scanner(System.in);System.out.println("计算开始:");int i,j,res;System.out.println("请输入被除数:");i=input.nextInt();System.out.println("请输入除数:");j=input.nextInt();res=i/j;System.out.println(i+"/"+j+"="+res);System.out.println("计算结束");}}
2.3.2使用throw抛出异常

在Java语言中,可以使用throw关键字来自行抛出异常。

package structure;public class Main {public static void main(String[] args) {Person1 person=new Person1();try {person.setName("扈三娘");person.setAge(18);person.setGender("男女");person.print();}catch (Exception e){e.printStackTrace();}}
}
class Person1{private String name="";private int age=0;private String gender="男";public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) throws Exception{if ("男".equals(gender)||"女".equals(gender)){this.gender = gender;}else {throw new Exception("性别必须是男或女!");}}public void print(){System.out.println("姓名:"+this.name+"性别:"+this.gender+"年龄:"+this.age);}
}

  • 如果 throw 语句抛出的异常是 Checked 异常,则该 throw 语句要么处于 try 块里,显式捕获该异常,要么放在一个带 throws 声明抛出的方法中,即把该异常交给该方法的调用者处理; 
  • 如果 throw 语句抛出的异常是 Runtime 异常,则该语句无须放在 try 块里,也无须放在带 throws 声明抛出的方法中;程序既可以显式使用 try...catch来捕获并处理该异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。
  • 自行抛出Runtime 异常比自行抛出Checked 异常的灵活性更好。同样,抛出 Checked 异常则可以让编译器提醒程序员必须处理该异常。

 throw和throws的区别:

1.作用不同:throw用于程序员自行产生并抛出异常,throws用于声明该方法内抛出了异常。
2.使用位置不同:throw位于方法体内部,可以作为单独的语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
3.内容不同:throw抛出一个异常对象,只能是一个;throws后面跟异常类,可以跟多个。

2.4自定义异常

当JDK中的异常类型不能满足程序的需要时,可以自定义异常类。步骤:

①定义异常类,并继承Exception或者RuntimeException。

②编写异常类的构造方法,向父类构造方法传入异常描述信息,并继承父类的其他实现方法。

③实例化自定义异常对象,并在程序中使用throw抛出。

package structure;public class Main {public static void main(String[] args) {Person1 person=new Person1();try {person.setName("扈三娘");person.setAge(18);person.setGender("男女");person.print();}catch (GenderException e){e.printStackTrace();}}
}
//自定义异常类
class GenderException extends Exception{public GenderException(String message){super(message);}
}
class Person1{private String name="";private int age=0;private String gender="男";public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) throws GenderException{if ("男".equals(gender)||"女".equals(gender)){this.gender = gender;}else {throw new GenderException("性别必须是男或女!");}}public void print(){System.out.println("姓名:"+this.name+"性别:"+this.gender+"年龄:"+this.age);}
}

自定义异常可能是编译时异常,也可能是运行时异常 。

1.如果自定义异常类继承Excpetion,则是编译时异常。
特点:方法中抛出的是编译时异常,必须在方法上使用throws声明,强制调用者处理。
2.如果自定义异常类继承RuntimeException,则运行时异常。
特点:方法中抛出的是运行时异常,不需要在方法上用throws声明。

2.5异常链

有时候我们会捕获一个异常后再抛出另一个异常。

顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。

在要抛出的对象中使用 initCause() 方法,添加上一个产生异常的信息; getCause() 可以获取当前异常对象的上一个异常对象。

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

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

相关文章

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——形式逻辑——选言假言——要么、或者与箭头的关系

角度 或则转化/鲁滨逊定律 (1)或者变箭头: P ∨ Q = ┐ P → Q = ┐ Q → P P∨Q=┐P→Q=┐Q→P P∨

详细介绍typescript的所有变量类型

目录 1. 任意类型(Any)2. 数字类型(Number)3. 字符串类型(String)4. 布尔类型(Boolean)5. 数组类型(Array)6. 元组类型(Tuple)-需求明…

研磨设计模式day14模板方法模式

目录 场景 原有逻辑 有何问题 解决方案 解决思路 代码实现 重写示例 模板方法的优缺点 模板方法的本质 何时选用 场景 现在模拟一个场景,两个人要登录一个系统,一个是管理员一个是用户,这两个不同身份的登录是由后端对应的两个接…

Android笔记--Hilt

Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。依赖注入的英文是Dependency Injection,简称DI,简单说一个类中使用的依赖…

Win11更新致蓝屏死机,应对技巧你必知!

Windows 11用户应该意识到,微软的最新更新导致一些电脑崩溃,并在可怕的死亡蓝屏上显示“UNSUPPORTED_PROCESSOR”。 这一点尤其值得注意,因为据报道,这种情况发生在自然情况下的Windows 11 PC上,因此对任何下载最新更…

数据结构day04(概念、顺序表)

今日任务 2.冒泡排序和选择排序 #define MAX 10typedef struct{int id; }data;typedef struct seq{data arr[MAX];int len; }seqList,*seqListP;/** function: 选择排序* param [ in] * param [out] * return */ int selectSort(seqListP p){if(is_empty(p))return 1;…

React Navigation 路由传参

页面之间传递参数 实现页面之间传递参数很简单&#xff0c;跟普通的 React 项目一样&#xff0c;具体实例入戏&#xff1a; // 传入参数 export default function Home(props: { navigation: any }) {return (<View><Text>Home</Text><Buttontitle"…

干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发

文章目录 文章说明 一&#xff1a;Rest协议简介 二&#xff1a;搭建开发环境 1&#xff1a;父项目里边引入的新的版本内容 2&#xff1a;Api中的操作 3&#xff1a;Provider模块 三&#xff1a;编码 1&#xff1a;API模块 2&#xff1a;Provider模块 3&#xff1a;Co…

学习总结(二) node.js服务器如何使用net模块向硬件发送命令与接收数据?

服务器server.js: const net require("net"); //此模块用于tcp/ip通讯 当收到get请求时: server.get("/cfjcApi/v1/SkyTempHudi", (req, res) > { let client new net.Socket(); client.connect(网络模块端口, 网络模块Ip, () > { //此模块…

leetcode做题笔记111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路一&#xff1a;递归 int minDepth(struct TreeNode* root){if(!root)return 0;int leftminDepth(root->le…

在springboot中配置mybatis(mybatis-plus)mapper.xml扫描路径的问题

我曾经遇到过类似问题&#xff1a; mybatis-plus的mapper.xml在src/main/java路径下如何配置pom.xml和application.yml_idea 把mapper文件放到java下如何配置_梓沂的博客-CSDN博客 当时只是找到解决问题的办法&#xff0c;但对mybatis配置来龙去脉并未深入了解&#xff0c;所…

Servlet的使用(JavaEE初阶系列17)

目录 前言&#xff1a; 1.Servlet API的使用 1.1HttpServlet 1.2HttpServletRequest 1.3HttpServletResponse 2.表白墙的更新 2.1表白墙存在的问题 2.2前后端交互接口 2.3环境准备 2.4代码的编写 2.5数据的持久化 2.5.1引入JDBC依赖 2.5.2创建数据库 2.5.3编写数…

clickhouse系列3:clickhouse分析英国房产价格数据

1.准备数据集 该数据集包含有关英格兰和威尔士自1995年起到2023年的房地产价格的数据,超过2800万条记录,未压缩形式的数据集大小超过4GB,在ClickHouse中需要约306MB。 2.clickhouse中建表 CREATE TABLE uk_price_paid (price UInt32,

Mysql 索引

索引 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09; 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应…

spring的后置处理器BeanPostProcessor

什么是BeanPostProcessor 是spring IOC容器给我们提供的一个扩展接口在调用初始化方法前后对bean进行额外加工&#xff0c;ApplicationContext会自动扫描实现了BeanPostProcessor的bean&#xff0c;并注册这些bean为后置处理器是bean的统一前置后置处理而不是基于某一个bean 执…

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 三、总结 一、理论 1.CA认证中心 &#xff08;1&#xff09;概念 CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户…

defaultdict, Counter, json包中的load, dump是否都保持插入顺序

自python3.7以来&#xff0c;python的dict都会保留插入顺序&#xff0c;那么相关的defaultdict, Counter&#xff0c;以及使用json.load、json.dump也一定能保持顺序吗&#xff1f; 结论&#xff1a;以上这些和dict一样&#xff0c;都会保留插入顺序 defaultdict&#xff1a;…

Linux防火墙相关命令

防火墙基础命令 systemctl status firewalld #查看防火墙状态 systemctl start firewalld #开启防火墙 systemctl stop firewalld #临时关闭 systemctl disable firewalld.service #关闭自启 systemctl enable firewalld.servi…

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源&#xff08;图片、JS、CSS&#xff09;&#xff0c; WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下&#xff0c;完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…

十四、组合模式

一、什么是组合模式 组合&#xff08;Composite Pattern&#xff09;模式的定义&#xff1a;有时又叫作整体-部分&#xff08;Part-Whole&#xff09;模式&#xff0c;它是一种将对象组合成树状的层次结构的模式&#xff0c;用来表示“整体-部分”的关系&#xff0c;使用户对单…