JavaSE学习——异常

目录

一、异常概述

二、异常的体系结果

二、异常的处理:抓抛模型

三、try-catch-finally的使用

四、throws + 异常类型  的使用

五、开发中如何选择使用try-catch-finally还是使用throws?

六、自定义异常

自定义异常步骤:

七、总结:异常处理5个关键字 

八、面试题:


一、异常概述

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

java程序在执行过程中所发生的异常事件可分为两类:

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StaticOverflowError和OOM。一般不边写针对性的代码进行处理。

Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

  • 空指针访问
  • 视图读取不存在的文件
  • 网络连续中断
  • 数组角标越界

对于这些错误,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。

捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。比如:除数为0,数组下标越界等。 

二、异常的体系结果

二、异常的处理:抓抛模型

过程一:“抛”

        程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。

        关于异常对象的产生:(1)系统自动生成的异常对象

                                            (2)手动地生成一个异常对象,并抛出(throw)

过程二:“抓”

        异常的两种处理方式:1.try-catch-finally    2.throws

三、try-catch-finally的使用

try{

        // 可能出现异常的代码

}catch(异常类型1 变量名1){

        // 处理异常的方式1

}catch(异常类型2 变量名2){

        // 处理异常的方式1

}catch(异常类型3 变量名3){

        // 处理异常的方式3

}

......

fianlly{

        // 一定会执行的代码

}

说明:

1.finally是可选的。

2.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。

3.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结果(在没有写finally的情况),继续执行其后的代码。

4.catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。

   catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面,否则报错。

5.常用的异常对象处理方式,(1)String getMessage()   (2)printStackTrace()

6.在try结构中声明的变量,在出了try结构以后,就不能再被调用。

7.使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

8.try-catch-finally结构可以相互嵌套。

   @Testpublic void test2() {FileInputStream fis = null;try {File file = new File("hello.txt");fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);data = fis.read();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (fis != null)fis.close();} catch (IOException e) {e.printStackTrace();}}}

9.finally的使用:

(1)finally是可选的。

(2)finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。

(3)像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动地进行资源的释放。此时的资源释放,就需要声明在finally中

10.开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,一定要考虑异常的处理。

四、throws + 异常类型  的使用

public static void main(String[] args){try{method();}catch(IOException e){e.printStackTrace();}
}public static void method() throws IOEception{test3();
}public static void test3() throws FileNotFoundException, IOException {File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);data = fis.read();}fis.close();}

1."throws+异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。

一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

2.try-catch-finally:真正地将异常给处理掉了。

   throws的方式知识将异常抛给了方法的调用者,并没有真正将异常处理掉。

五、开发中如何选择使用try-catch-finally还是使用throws?

1.如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理

2.执行的方法a中,先后有调用了另外的几个方法,这几个方法是递归关系执行的。建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

3.通常情况下,建议在方法内部使用try-catch-finally来捕获和处理异常,以提供更精确的异常处理逻辑,并在可能发生异常的地方立即进行处理。而将异常向上层方法抛出则是相对较少使用的情况,通常用于在当前方法无法处理异常或无法提供合适的异常处理逻辑时。

六、自定义异常

自定义异常步骤:

1.一般地,用户自定义异常类都是RuntimeException的子类。

2.自定义异常类通常需要编写几个重载的构造器。

3.自定义异常需要提供serialVersionUID

4.自定义的异常通过throw抛出。

5.自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。

public class MyException extends RuntimeException {static final long serialVersionUID = -70489991561564898L;public MyException() {}public MyException(String message) {super(message);}
}
public class StudentTest {public static void main(String[] args) {try {Student student = new Student();student.regist(-2);System.out.println(student);} catch (Exception e) {System.out.println(e.getMessage());}}
}class Student {private int id;public void regist(int id) {if (id > 0) {this.id = id;} else {
//            throw new RuntimeException("您输入的数据非法!");throw new MyException("您输入的数据非法!");}}
}

 输出结果:

public class EcmDef {public static void main(String[] args) {try {int i = Integer.parseInt(args[0]);int j = Integer.parseInt(args[1]);int result = ecm(i, j);System.out.println(result);} catch (NumberFormatException e) {System.out.println("数据类型不一致!");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("缺少命令行参数");} catch (ArithmeticException e) {System.out.println("除以0");} catch (EcDef e) {System.out.println(e.getMessage());}}public static int ecm(int i, int j) throws EcDef {if (i < 0 || j < 0) {throw new EcDef("分子或分母为负数了!");}return i / j;}

七、总结:异常处理5个关键字 

 

八、面试题:

throw与throws的区别?

throw:抛出异常。用来抛出一个具体的异常(自己定义异常的行为)

1.在方法体的内部,用在方法体后面抛出的是异常的对象

2.只能抛出一个异常对象名

3.表示抛出的异常,有方法体中的语句来进行处理

4.throw表示一定抛出了某种异常
throws:声明异常。在写方法时候用于给自己声明检查异常,可以不用做任何处理,直接往上面抛,谁来调用谁就来处理。

1.在方法声明的后面,抛出的是异常的类型

2.可以包含有多个异常类型,用“,”隔开

3.抛出的异常由调用者来进行处理

4.throws表示可能抛出了某种异常。 

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

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

相关文章

Vue中使用ref($refs未定义underfined)

1. 调用地方 ref是在渲染之后才出现的 可以在mounted里面调用可以使用this.$nextTick(()>{})里面调用 2. 调用对象 ref不是响应式的&#xff0c;所以动态加载模板更新&#xff0c;ref无法更新&#xff0c;以下情况是出现underfined 结合v-if使用 …

复原20世纪复古修仙游戏

前言 在本教程中&#xff0c;我突发奇想&#xff0c;想做一个复古的修仙游戏&#xff0c;考虑到以前的情怀决定做个古老的躺平修仙游戏 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python…

适配器模式简介

概念&#xff1a; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作。 特点&#xff1a; 通过适配器&#xff0c;可以使原本因为接口不匹配而无法…

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展&#xff0c;支持实时数据流的处理&#xff0c;并且具有可扩展&#xff0c; 高吞吐量&#xff0c;容错的特点。 数据可以从许多来源获取&#xff0c;如 Kafka &#xff0c; Flume &#xff0c; Kin…

全景图像生成算法

摘要 全景图像生成是计算机视觉领域的一个重要研究方向。本文对五种经典的全景图像生成算法进行综述&#xff0c;包括基于相机运动估计的算法、基于特征匹配的算法、基于图像切割的算法、基于多项式拟合的算法和基于深度学习的算法。通过对这些算法的原理、优缺点、适用场景等…

【附源码】Axure RP Pro8.0安装教程|HTML|网页设计

软件下载 软件&#xff1a;Axure版本&#xff1a;8.0语言&#xff1a;简体中文大小&#xff1a;82.53M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.com/s/…

Springboot四种实现鉴权方式各自的优缺点

拦截器&#xff1a;拦截器是基于SpringMVC的一种机制&#xff0c;它可以在请求到达控制器之前或之后进行拦截和处理&#xff0c;比如验证用户身份&#xff0c;记录日志&#xff0c;添加响应头等。 优点&#xff1a;拦截器可以获取到请求的上下文信息&#xff0c;如请求路径&…

部署 ssm 项目到云服务器上(购买云服务器 + 操作远程云服务器 + 服务器中的环境搭建 + 部署项目到服务器)

部署 Web 项目 1、获取 Linux 环境1.1、如何去买一个云服务器1.2、远程操作云服务器1.3、在 Linux 系统中搭建 Java Web 的运行环境。1&#xff09;安装 JDK&#xff08;使用包管理器 yum 来安装&#xff09;2&#xff09; 安装Tomcat3&#xff09;安装 MySQL。 1.4、在云服务器…

【力扣每日一题】2023.8.28 插入区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 和昨天的题大差不差&#xff0c;我们仍然是有一堆区间&#xff0c;题目给我们一个新的区间&#xff0c;要我们把新区间插入到原本的区间数…

腾讯云便宜购买指南(腾讯云怎样购买划算)

腾讯云是国内知名的云计算服务商&#xff0c;拥有广泛的应用和用户群体。对于有需要的用户来说&#xff0c;怎样便宜购买腾讯云产品是一个值得关注的问题&#xff0c;下面给大家分享腾讯云便宜购买指南。 腾讯云便宜购买指南&#xff1a;1、新用户专属礼包&#xff1b;2、老用户…

Postman —— postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数每…

远程连接虚拟机中ubuntu报错:Network error:Connection refused

ping检测一下虚拟机 可以ping通&#xff0c;说明主机是没问题 #检查ssh是否安装&#xff1a; ps -e |grep ssh发现ssh没有安装 #安装openssh-server sudo apt-get install openssh-server#启动ssh service ssh startps -e |grep ssh检查一下防火墙 #防火墙状态查看 sudo ufw…

使用 Transformer 和 Amazon OpenSearch Service 构建基于列的语义搜索引擎

在数据湖中&#xff0c;对于数据清理和注释、架构匹配、数据发现和跨多个数据来源进行分析等许多操作&#xff0c;查找相似的列有着重要的应用。如果不能从多个不同的来源准确查找和分析数据&#xff0c;就会严重拉低效率&#xff0c;不论是数据科学家、医学研究人员、学者&…

智慧化工地SaaS平台源码,PC端+APP端+智慧数据可视化大屏端,源码完全开源不封装,自主研发,支持二开,项目使用,微服务+Java++vue+mysql

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

es和数据库同步方案

5.5 课程信息索引同步 5.5.1 技术方案 通过向索引中添加课程信息最终实现了课程的搜索&#xff0c;我们发现课程信息是先保存在关系数据库中&#xff0c;而后再写入索引&#xff0c;这个过程是将关系数据中的数据同步到elasticsearch索引中的过程&#xff0c;可以简单成为索引…

C++类相关知识

鸽了好久&#xff0c;回来更新下吧 C类 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&#xff0c;函数称为成员函数。类可以被看作是一种模板&#xff0c;可以用来创建具有相同属性和行为…

ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN

文章目录 ip_vs hook 后NF_INET_LOCAL_IN 本章重点&#xff1a; k8s 如何利用 ip_vs 实现源 IP 会话亲和性。 ip_vs hook 后 NF_INET_LOCAL_IN 根据优先级依次是 ip_vs_reply4&#xff0c;ip_vs_remote_request4 ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb&#xf…

免费API集合分享,赶紧收藏起来~

天气预警&#xff1a;支持输入经纬度或者区域编码&#xff0c;获取指定城市当前生效中的各类天气预警&#xff0c;如寒潮蓝色预警信号&#xff0c;或一次性拉取全国所有生效中的天气预警。 通知短信&#xff1a;当您需要快速通知用户时&#xff0c;通知短信是最快捷有效的方式…

Redis之发布订阅

一、Redis的发布订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者&#xff08;subscriber&#xff09;&#xff1a;每当有其他客户端向被订阅的频…

数据结构之哈希

哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 4. 哈希的应用4.1 位图4.2 布隆过滤器 哈希&#xff08;Hash&#xff09;是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式&#xff0c;也是一种常见的检索方…