第09章:随堂复习与企业真题(异常处理)

来源:尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)

基本都是宋老师发的资料里面的内容,只不过补充几个资料里没直接给出答案的问题的答案。
不想安装markdown笔记的app所以干脆在这里发一遍。

第09章:随堂复习与企业真题(异常处理)


一、随堂复习

1. 异常的概述

1. 什么是异常?
指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。2. 异常的抛出机制
Java中把不同的异常用不同的类表示,一旦发生某种异常,就`创建该异常类型的对象`(万事万物皆对象),并且抛出(throw)。
然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常
对象将会导致程序终止。3. 如何对待异常对于程序出现的异常,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及`异常的处理`,保证代码的`健壮性`。

2. 异常的体系结构及常见的异常

java.lang.Throwable:异常体系的根父类|---java.lang.Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。|---- StackOverflowError、OutOfMemoryError|---java.lang.Exception:异常。我们可以编写针对性的代码进行处理。|----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。(会看到标红,报错)(要提前写 try catch )|----- ClassNotFoundException|----- FileNotFoundException|----- IOException|----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。|---- ArrayIndexOutOfBoundsException|---- NullPointerException|---- ClassCastException|---- NumberFormatException|---- InputMismatchException|---- ArithmeticException
【面试题】说说你在开发中常见的异常都有哪些?开发1-2年:
|----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。|----- ClassNotFoundException|----- FileNotFoundException|----- IOException
|----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。|---- ArrayIndexOutOfBoundsException|---- NullPointerException|---- ClassCastException|---- NumberFormatException|---- InputMismatchException|---- ArithmeticException开发3年以上:
OOM。

3. 异常处理的方式

过程1:“抛”>"自动抛" : 程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,自动生成对应异常类的对象,并将此对象抛出。>"手动抛" :程序在执行的过程当中,不满足指定条件的情况下,我们主动的使用"throw + 异常类的对象"方式抛出异常对象。过程2:“抓”狭义上讲:try-catch的方式捕获异常,并处理。广义上讲:把“抓”理解为“处理”。则此时对应着异常处理的两种方式:① try-catch-finally ② throws
3.1 try-catch-finally
1. 基本结构:
try{...... //可能产生异常的代码
}
catch( 异常类型1 e ){...... //当产生异常类型1型异常时的处置措施
}
catch( 异常类型2 e ){......     //当产生异常类型2型异常时的处置措施
}
finally{...... //无论是否发生异常,都无条件执行的语句
}2. 使用细节:
> 将可能出现异常的代码声明在try语句中。一旦代码出现异常,就会自动生成一个对应异常类的对象。并将此对象抛出。
> 针对于try中抛出的异常类的对象,使用之后的catch语句进行匹配。一旦匹配上,就进入catch语句块进行处理。一旦处理接触,代码就可继续向下执行。
> 如果声明了多个catch结构,不同的异常类型在不存在子父类关系的情况下,谁声明在上面,谁声明在下面都可以。如果多个异常类型满足子父类的关系,则必须将子类声明在父类结构的上面。否则,报错。
> catch中异常处理的方式:① 自己编写输出的语句。② printStackTrace():打印异常的详细信息。 (推荐)③ getMessage():获取发生异常的原因。
> try中声明的变量,出了try结构之后,就不可以进行调用了。
> try-catch结构是可以嵌套使用的。
3. finally的使用说明:
3.1 finally的理解
> 我们将一定要被执行的代码声明在finally结构中。
> 更深刻的理解:无论try中或catch中是否存在仍未被处理的异常,无论try中或catch中是否存在return语句等,finally中声明的语句都一定要被执行。> finally语句和catch语句是可选的,但finally不能单独使用。3.2 什么样的代码我们一定要声明在finally中呢?
> 我们在开发中,有一些资源(比如:输入流、输出流,数据库连接、Socket连接等资源),在使用完以后,必须显式的进行
关闭操作,否则,GC不会自动的回收这些资源。进而导致内存的泄漏。为了保证这些资源在使用完以后,不管是否出现了未被处理的异常的情况下,这些资源能被关闭。我们必须将这些操作声明
在finally中!
3.2 throws
1. 格式:在方法的声明除,使用"throws 异常类型1,异常类型2,..."2. 举例:public void test() throws 异常类型1,异常类型2,.. {//可能存在编译时异常
}3. 是否真正处理了异常?
> 从编译是否能通过的角度看,看成是给出了异常万一要是出现时候的解决方案。此方案就是,继续向上抛出(throws)。
> 但是,此throws的方式,仅是将可能出现的异常抛给了此方法的调用者。此调用者仍然需要考虑如何处理相关异常。从这个角度来看,throws的方式不算是真正意义上处理了异常。4. 方法的重写的要求:(针对于编译时异常来说的)
子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。

开发中的经验之谈:

开发中,如何选择异常处理的两种方式?(重要、经验之谈)
- 如果程序代码中,涉及到资源的调用(流、数据库连接、网络连接等),则必须考虑使用try-catch-finally来处理,保证不出现内存泄漏。
- 如果父类被重写的方法没有throws异常类型,则子类重写的方法中如果出现异常,只能考虑使用try-catch-finally进行处理,不能throws。
- 开发中,方法a中依次调用了方法b,c,d等方法,方法b,c,d之间是递进关系。此时,如果方法b,c,d中有异常,我们通常选择使用throws,而方法a中通常选择使用try-catch-finally。

4. 手动throw异常对象

在方法内部,满足指定条件的情况下,使用"throw 异常类的对象"的方式抛出。
public static int divide(int m, int n) throws BelowZeroException {if (m < 0 || n < 0){//手动抛出异常类的对象throw new BelowZeroException("输入了负数");}return m / n;}

注意分辨 throw(个性化的要求,主动去抛) 和 throws!

5. 如何自定义异常类

① 继承于现有的异常体系。通常继承于RuntimeException \ Exception
② 通常提供几个重载的构造器
③ 提供一个全局常量,声明为:static final long serialVersionUID;
public class BelowZeroException extends Exception{static final long serialVersionUID = -93124229948L;public BelowZeroException() {}public BelowZeroException(String message) {super(message);}
}
为什么需要自定义异常类?
我们其实更关心的是,通过异常的名称就能直接判断此异常出现的原因。既然如此,我们就有必要在实际开发场景中,
不满足我们指定的条件时,指明我们自己特有的异常类。通过此异常类的名称,就能判断出具体出现的问题。

二、企业真题

2.1 异常概述

1. Java的异常体系简单介绍下(网*)
包含问题:
> 4.异常的顶级接口是什么(软**力)  
> 异常类的继承关系,exception下都有哪些类?(上海*冉信息)

答:

java.lang.Throwable:异常体系的根父类|---java.lang.Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。|---- StackOverflowError、OutOfMemoryError|---java.lang.Exception:异常。我们可以编写针对性的代码进行处理。|----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。(会看到标红,报错)(要提前写 try catch )|----- ClassNotFoundException|----- FileNotFoundException|----- IOException|----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。|---- ArrayIndexOutOfBoundsException|---- NullPointerException|---- ClassCastException|---- NumberFormatException|---- InputMismatchException|---- ArithmeticException
2. Java异常处理机制(*科软)

两种处理方案:try-catch-finally ;throws

3. 异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)
Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
Exception:异常。我们可以编写针对性的代码进行处理。
4. 运行时异常与一般异常有何异同?(华*思为)

运行时异常:RuntimeException

  • 编译可以通过。在运行时可能抛出。出现的概率高一些;一般针对于运行时异常,都不处理。

一般异常:Exception

  • 编译不能通过。要求必须在编译之前,考虑异常的处理。不处理编译不通过。
5. 说几个你常见到的异常(华油**普)
类似问题:
> 请列出Java中常见的几种异常?(百*园)
> 给我一个你最常见到的runtime exception。(*蝶)

2.2 try-catch-finally

1. 说说final、finally、finalize的区别(北京中**译、艾*软件、拓*思、*科软)
类似问题:
> 1. finally和final的区别(*科软)

没有共同点,就说明各自的就行

> final:关键字,如果修饰类,则表示该类不能被继承,没有子类。  如果修饰方法,则该方法不能被子类重写。  如果修饰变量,就是大写的常量。
> finally:一定要被执行的代码
> finalize:在8.2 object 的方法里面讲的,第四个方法。当对象要被GC回收时,留下遗言。(在jdk9已经弃用了)
2. 如果不使用try-catch,程序出现异常会如何?(上海冠*新创科技)

对于当前方法来讲,如果不使用try-catch,则在出现异常对象以后会抛出此对象。如果没有处理方案,就会终止程序的执行。

3. try … catch捕捉的是什么异常?(北京亿*东方)

Exception。非Error

4. 如果执行finally代码块之前方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)

会。
但是:特别的:System.exit(0); 此时强行让jvm结束了,就不执行了。

5. 在try语句中有return语句,最后写finally语句,finally语句中的code会不会执行?何时执行?如果执行是在return前还是后(拓*思、华**为)

先把return的值放入操作数栈,然后执行finally中的代码,再return,return的值出栈。

6. 捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)

会。可以。会。return之前还要执行finally。

2.3 throw与throws

1. throw和throws的区别?(北京亿**方、北京新*阳光)

角度1:“形”,即使用的格式

throw:使用在方法内部,“throw 异常类的对象”
throws:使用在方法的声明处,"throws 异常类1,异常类2,..."

角度2:"角色"或作用不同。

上游排污,下游治污。过程1:“抛”>throw
过程2:“抓”> try-catch ; throws
2. 子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类(顺*)

不能!

2.4 自定义异常

1. 如何自定义一个异常?(*软国际)

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

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

相关文章

[Angular] 笔记 16:模板驱动表单 - 选择框与选项

油管视频&#xff1a; Select & Option (Template Driven Forms) Select & Option 在 pokemon.ts 中新增 interface: export interface Pokemon {id: number;name: string;type: string;isCool: boolean;isStylish: boolean;acceptTerms: boolean; }// new interface…

前端图片适配不同屏幕方案

预备知识&#xff1a; 设备独立像素,以下图的iphone12 Pro为例&#xff0c;390*844表示的就是设备独立像素&#xff08;DIP&#xff09;,也可以理解为CSS像素 物理像素&#xff08;设备像素&#xff09;&#xff0c;就是屏幕的分辨率&#xff0c;显示屏就是由一个个物理像素…

QT/C++ 远程数据采集上位机+服务器

一、项目介绍&#xff1a; 远程数据采集与传输 课题要求:编写个基于TCP的网络数据获取与传输的应用程序; 该程序具备以下功能: 1)本地端程序够通过串口与下位机(单片机)进行通信&#xff0c;实现数据采集任务 2)本地端程序能将所获取下位机数据进行保存(如csv文本格式等); 3…

初识隧道代理HTTP:理解基础概念的重要性

嗨&#xff0c;小伙伴们&#xff01;如果你对网络世界充满好奇&#xff0c;那么这篇文章就是为你准备的。我们将一起踏上一段奇妙的旅程&#xff0c;探索一个叫做“隧道代理HTTP”的新领域。但在这之前&#xff0c;我们需要先穿上“基础概念”的防护服&#xff0c;以免被这个复…

axios配置代理

ChatGPT&#xff08;3.5/4.0&#xff09;国内镜像&#xff1a;https://www.atalk-ai.com/ 在Node.js中&#xff0c;你可以使用axios库来发送HTTP请求&#xff0c;并且可以配置它来使用代理服务器。以下是如何配置axios以通过位于127.0.0.1:15236的代理服务器发送请求的例子&am…

MR实战:实现数据去重

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、Map阶段实现&#xff08;1&#xff09;创建Maven项目&#xff08;2&#xff09;添加相关依赖…

一语道破爬虫,来揭开爬虫面纱

目录 一、爬虫&#xff08;网络蜘蛛(Spider)&#xff09; 1.1、是什么&#xff1a; 1.2、学习的原因 1.3、用在地方&#xff1a; 1.4、是否合法&#xff1a; 1.5、后果 案例&#xff1a; 二、应用领域 三、Robots协议 四、抓包 4.1、浏览器抓包 4.2、抓包工具 常见…

从0到1浅析Redis服务器反弹Shell那些事

文章目录 前言Redis服务1.1 特点与应用1.2 安装与使用1.3 语法和配置1.4 未授权访问 反弹Shell2.1 Web服务写入Webshell2.2 Linux定时任务反弹shell2.3 /etc/profile.d->反弹shell2.4 写入ssh公钥登录服务器2.5 利用Redis主从复制RCE2.6 SSRF漏洞组合拳->RCE 总结 前言 …

2023年终-顺势而为

疫情以来&#xff0c;越来越感觉到顺势的重要性&#xff0c;就像一个人走路一样&#xff0c;如果方向错了&#xff0c;会绕很多弯才能到达终点。 雷军说&#xff0c;站在风口上猪都能飞起来。 很多人明白这个道理&#xff0c;但是去付出实践的人不多。第一&#xff0c;不愿意进…

stm32中的i2c协议

stm32中I2C 文章目录 stm32中I2CI2C 协议简介I2C物理层协议层I2C基本读写过程 **通讯的起始和停止信号****数据有效性****地址及数据方向****响应** STM32的I2C特性及架构**STM32** **的** I2C外设简介STM32 的 I 2C 架构剖析通讯引脚 通讯过程主发送器主接收器 I2C初始化结构体…

【Linux】指令(本人使用比较少的)——笔记(持续更新)

文章目录 ps -axj&#xff1a;查看进程ps -aL&#xff1a;查看线程echo $?&#xff1a;查看最近程序的退出码jobs&#xff1a;查看后台运行的线程组fd 任务号&#xff1a;将后台任务提到前台bg 任务号&#xff1a;将暂停的后台程序重启netstat -nltp&#xff1a;查看服务及监听…

Unity Meta Quest 一体机开发(十二):【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮

文章目录 &#x1f4d5;教程说明&#x1f4d5;给玩家配置 HandPokeInteractor&#x1f4d5;用 3D 物体制作可以被点击的 UI 按钮⭐搭建物体层级⭐给物体添加脚本⭐为脚本变量赋值 &#x1f4d5;模仿官方样例按钮的样式&#x1f4d5;在按钮上添加文字&#x1f4d5;修改按钮图片 …

Unity应该如何学

Unity是目前最主流的游戏开发引擎&#xff0c;AppStore里面排名前列的游戏绝大部分都是采用Unity引擎来开发的&#xff0c;所以Unity引擎的前景也是非常好的&#xff0c;同时很多AR,VR也是基于Unity的&#xff0c;所以对于做游戏而言Unity引擎是非常值得学习的。如何学习Unity呢…

Nginx 403 Forbidden错误处理

当出现 Nginx 403 Forbidden 错误时&#xff0c;有几种可能的原因&#xff1a; 1. 权限问题 文件或目录权限不正确&#xff1a; 使用 chown -R nginx:nginx /dist/ 更改了目录的所有权和权限&#xff0c;但是可能存在子文件或子目录的权限问题。检查所有文件和子目录确保它们…

基于MINIST的手写数字体识别

一、算法简述 网络结构设计 通过创建MnistNet类&#xff0c;定义了包含两个卷积层和两个全连接层的深度神经网络。这个网络的设计灵感来自于经典的CNN结构&#xff0c;其中卷积层用于提取图像特征&#xff0c;而全连接层则用于将这些特征映射到最终的类别。 卷积与池化 卷…

2023年工作总结

今天就不写技术内容了,准备写一个简短的年度总结,类似于去年,作为2023年的收尾。 又到年根了,该总结啦,记得在去年展望2023年时,给自己立了几个flag:读书,paper,blog(有深度),知识图谱+AI,三维可视化服务端设计等等,现在回顾这一年的工作,除了paper方面,其他方…

Docker 入门 ------ 基本命令

1. 使用Docker镜像 1.1 获取镜像 主要命令: docker pull NAME[:TAG] NAME 为镜像名称&#xff0c;后跟:版本号&#xff0c;如果没有跟后面的版本号&#xff0c;默认拉取最新的稳定版本 例子&#xff1a; 上述命令相当于&#xff1a;docker.io/library/ubuntu:latest 1.2 查…

基于metersphere和supper-jacoco 测试覆盖率落地实践

一、背景及目标 背景 1、技术研发流程为测试 提供冒烟用例-开发根据用例自测-提测-开始测试&#xff0c;这一套流程&#xff0c;但是中间开发是否真实执行冒烟&#xff0c;测试并不知晓&#xff0c;而且测试提供冒烟用例是否符合标准也没法进行量化 2、公司产品属于saas产品&…

企业私有云容器化架构

什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统&#xff0c;在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual Machine Monitor&#xff0c;VMM&#x…