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.rhkb.cn/news/108317.html

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

相关文章

VR/AR/眼镜投屏充电方案(LDR6020)

VR眼镜即VR头显&#xff0c;也称虚拟现实头戴式显示设备&#xff0c;随着元宇宙概念的传播&#xff0c;VR眼镜的热度一直只增不减&#xff0c;但是头戴设备的续航一直被人诟病&#xff0c;如果增大电池就会让头显变得笨重影响体验&#xff0c;所以目前最佳的解决方案还是使用VR…

实时同步ES技术选型:Mysql+Canal+Adapter+ES+Kibana

基于之前的文章&#xff0c;精简操作而来 让ELK在同一个docker网络下通过名字直接访问Ubuntu服务器ELK部署与实践使用 Docker 部署 canal 服务实现MySQL和ES实时同步Docker部署ES服务&#xff0c;canal全量同步的时候内存爆炸&#xff0c;ES/Canal Adapter自动关闭&#xff0c…

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象&#xff0c;而无需暴露对…

wireshark 流量抓包例题重现

[TOC](这里写目录标题 wireshark抓包方法wireshark组成 wireshark例题 wireshark抓包方法 wireshark组成 wireshark的抓包组成为&#xff1a;分组列表、分组详情以及分组字节流。 上面这一栏想要显示&#xff0c;使用&#xff1a;CtrlF 我们先看一下最上侧的搜索栏可以使用的…

LAMP架构详解+构建LAMP平台之Discuz论坛

LAMP架构详解构建LAMP平台之Discuz论坛 1、LAPM架构简介1.1动态资源与语言1.2LAPM架构得组成1.3LAPM架构说明1.4CGI和astcgi1.4.1CGI1.4.2fastcgi1.4.3CGI和fastcgi比较 2、搭建LAMP平台2.1编译安装apache httpd2.2编译安装mysql2.3编译安装php2.4安装论坛 1、LAPM架构简介 1.…

Mysql--技术文档--基本概念--《世界上最流行的关系型数据库之一》

官方网址 MySQL 阿丹&#xff1a; 作为关系型数据库管理的老大哥&#xff0c;一个合格的程序员多多少少一定要了解mysql库。 官方解释 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管…

SpringCache

SpringCache是Spring提供的一个缓存框架&#xff0c;在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中&#xff0c;在4.1开始&#xff0c;缓存已支持JSR-107注释和更多自定义的选项。 Spring Cache利用了AOP&#xff0c;实现了基于注解的缓存功能&#xff0c;并且进…

智慧能源助力绿色发展

居民生活是碳排放的重要贡献源&#xff0c;作为居民生活的主要场所&#xff0c;社区是低碳城市建设的重要空间载体。推动低碳社区建设&#xff0c;逐渐打造低碳生活方式&#xff0c;是低碳社会建设的重要内容之一。智慧新能源公共设施助力碳中和&#xff0c;用于各社区改造&…

CSDN编程题-每日一练(2023-08-27)

CSDN编程题-每日一练&#xff08;2023-08-27&#xff09; 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …

【广州华锐互动】VR沉浸式体验红军长征路:追寻红色记忆,传承红色精神

在历史的长河中&#xff0c;长征无疑是一段充满艰辛和英勇的伟大征程。为了让更多的人了解这段历史&#xff0c;我们利用虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为您带来一场沉浸式的体验&#xff0c;重温红军万里长征的壮丽篇章。 一、踏上长征之路 戴上VR眼镜&a…

【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?

在3dMax中如何把三维物体转化为由样条线构成的对象&#xff1f;通常这样的场景会出现在科研绘图或一些艺术创作当中&#xff0c;下面给大家详细讲解一种3dmax三维物体转样条线的方法。 第一部分&#xff1a;用粒子填充3D对象&#xff1a; 1.创建一个三维对象&#xff08;本例…

linux操作系统的权限的深入学习(未完)

1.Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户…

华为OD七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第2期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结1、《代码…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第三天&#xff09;Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder&#xff0c;掌握MyBatis核心配置文件以及元素的使用,也掌握My…

java八股文面试[数据结构]——集合框架

Java集合体系框架 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口&#xff1a; Map接口派生&#xff1a; Map代表的是存储key-value对的集合&#xff0c;可根据元素的key来访问value。 因此Java集合大致也可分成List、Set、Queue、Map…

美创科技荣获“2023年网络安全优秀创新成果大赛—杭州分站赛”两项优胜奖

近日&#xff0c;由浙江省互联网信息办公室指导、中国网络安全产业联盟&#xff08;CCIA&#xff09;主办&#xff0c;浙江省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛-杭州分站赛”正式公布评选结果。 经专家评审&#xff0c;美创科技报名参赛的解决方案—“医…

什么是回调函数(callback function)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数&#xff08;Callback Function&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第五天&#xff09;MyBatis的注解开发 ​ 昨天我们深入学习了MyBatis多表之间的关联映射&#xff0c;了解掌握了一对一关联映射&#xff0c;一对多关联映射&#xff0c;嵌套查询方…

Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资

你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中两则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选…

Proteus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Proteus软件是一款电路设计和仿真的综合性软件&#xff0c;由Labcenter公司开发。它提供了一个交互式的图形界面&#xff0c;用户可以在其中构建电路、仿真结果并实时观察仿真结果。 1、Proteus的历史和演变 Proteus软件最初于…