mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
  • 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!

1.异常体系

在Java异常这个大家族中,Throwable是这个异常家族中的老大,它下面有两个靠谱老弟,一个叫“Error”,一个叫“Exception”。Error老弟负责错误部门,Exception老弟负责异常部门,它们各司其职。我给它们做了一个结构图:

6b852738eb99ee9c0fbde177fe96f7ad.png

Throwable在上一章《“全栈2019”Java异常第十六章:Throwable详解》中已经介绍过了,而Exception我们已经不陌生了,前面文章都和Exception有关,Error我们比较陌生一点,这一章章我们就着重讲解它。

2.已检查的异常

在上一章中,我们知道出于编译时检查异常的目的,Throwable和Throwable的任何子类(除Error和RuntimeException的子类)都被视为已检查的异常

6f8bf549c9df14f349ead2802efb322c.png

Error不是已检查的异常,那Error是什么呢?

Error是错误。

在Java异常体系中有三种异常:

第一种异常是已检查的异常。

第二种异常是错误。

第三种异常是运行时异常。

已检查的异常在上一章已经聊过了,现在我们来聊聊错误。运行时异常放在Exception的下一章讲解。

3.错误

57a7ade43671d43c9d23e4c77a128c6a.png

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。当错误发生时,这些错误应该是无法预测或恢复的(try-catch或throws)。

当我们遇到Error时,我们不应该去使用try-catch捕获它,也不应该throws将错误抛出去。

那该如何是好?

我们应该手动排查错误出现的原因及位置,然后把它解决在程序运行之前。

这里有一点非常重要,“当我们遇到Error时,我们不应该去使用try-catch捕获它,也不应该throws将错误抛出去。”说的都是不应该,不是说不能。我们还是可以使用try-catch或throws,只是不应该这样去做。

通俗来讲就是,异常就像电脑打开某个软件,然后软件因为某个操作而崩溃了,这时你可以再重新打开一次软件,这就相当于捕获异常的操作修复好这个问题了;而错误就不一样,错误就像你电脑冒烟了,这时你肯定是修不好了,也就相当于你无法捕获这个错误去修复它。当然了,有小伙伴说电脑冒烟我能不能修复的试试?当然可以,这就和我们程序中遇到Error时,可以使用try-catch或者thorws,但是不建议你这么做。

我们来结合例子看看。

演示:

请抛出一个错误。

请观察程序代码及结果。

代码:

Main类:

8a734e27067a3722cd16f4f1699d8a84.png

结果:

2506f7ee58b6227ffa1400e9ad4cd3b9.png

从运行结果来看,Error不是不能被try-catch的,而且不光可以try-catch程序还被修复好了,从运行结果我们就可以看出来:

47d29d538235a92fcadbd86aa12d383b.png

那么我们程序本身做了什么呢?

首先,我们抛出一个Error对象,用来模拟制造一个错误:

710fbb97bf9db350bf39ec9622bc3aee.png

紧接着,我们对其进行try-catch处理:

251a210350cb331ded996e7680756f9f.png

在catch中我们打印Error的堆栈跟踪信息:

fe87f09f2244a1155350da61b9dc6204.png

在try-catch的下面我们输出了一段话,这行代码的作用只有一个,那就是验证我们的错误是被成功修复的:

bad260248793e8df8efb09f5d2a51326.png

程序执行结果也符合预期:

dc0daffe4edecab6157aff97fcd5f5eb.png

可能小伙伴们说,这例子也太技术含量了吧,是不是有点太敷衍我们了?

这个例子仅仅只是演示Error可以被try-catch,下面我们来一个实际开发中的案例,而且这个错误是日常开发中偶尔会碰到的。

4.内存溢出OutOfMemoryError

OutOfMemoryError对于大多数零基础的同学来说,可能比较陌生,但是对于稍微有些开发经验的同学来说,也算是打过几次照面的。

OutOfMemoryError是什么?

OutOfMemoryError是内存溢出错误。

OutOfMemoryError什么时候会发生?

OutOfMemoryError在JVM(Java虚拟机)内存不足的情况下会发生。

大家还记得我们在讲解《“全栈2019”Java异常第十三章:访问异常堆栈跟踪信息》一章中讲到的JVM内存图吗?里面我们讲到JVM会去申请一块内存空间,这块内存空间专门是用来存放Java应用数据的(比如基本数据类型、数组、对象...等等)。当这块内存空间不足的时候,就会发生OutOfMemoryError异常。

来个例子演示一下。

演示:

请制造一个OutOfMemoryError异常。

请观察程序代码及结果。

代码:

Main类:

da991aff95c43431421bb8ca43d4be1c.png

结果:

2daf3c48c84a3c2ed125ad41e1fab1e1.png

从运行结果来看,我们程序的确是发生了OutOfMemoryError异常。接下来,我们看看它是怎么发生的。

程序代码真的是好简单,就一行:

be03a93198eadcffdcf3f263bc285a0c.png

我们创建了一个int类型的数组,只不过就是数组长度有点大,1024 * 1024 * 1024个长度。

为什么这一行代码会产生OutOfMemoryError异常,让JVM内存溢出?

因为我们在创建数组的时候,实际上就是在申请一块内存空间用,这个内存空间就是数组的地盘,而且数组在申请内存空间的时候,还会按照数据类型的大小来预支实际内存大小,我们知道一个int占4个字节,我们申请了1024 * 1024 * 1024个int这么多的4个字节,可想而知内存申请有多大,所以创建一个长度超出JVM内存大小的数组时,就会产生OutOfMemoryError异常。

有的小伙伴的JVM内存可能有足够大,所以当他运行和我一摸一摸的程序时,程序并没有崩溃,那么请这样的小伙伴再在数组长度的后面乘以1024。

为什么是1024?

因为1024在程序计算中容易换算,比如1KB=1024B(B:字节)。

像OutOfMemoryError我们就必要去捕获它了,真发生了OutOfMemoryError程序就只能是崩溃之后重新运行。

为什么没必要?

我们不知道它会什么时候出现,实际开发不像我们上面这样去写一个长度超出JVM内存大小的数组,内存的申请发生在每一行代码身上,我不知道哪一行代码运行时会造成OutOfMemoryError。

虽说没必要,但是我们有没有什么应对的措施?

有,实际开发中我们碰到OutOfMemoryError的时候就会去分析我们的程序代码,找出那个产生OutOfMemoryError的源头,修正程序。

总结

  • Error是错误。它是Java异常体系中的一种。
  • Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。
  • 当我们遇到Error时,我们不应该去使用try-catch捕获它,也不应该throws将错误抛出去。
  • OutOfMemoryError是内存溢出错误。
  • 实际开发中我们碰到OutOfMemoryError的时候就会去分析我们的程序代码,找出那个产生OutOfMemoryError的源头,修正程序。

至此,Java中Error相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java异常第十六章:Throwable详解

下一章

“全栈2019”Java异常第十八章:Exception详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

2881c8854b60513f9e88e08e70caa95f.png

版权声明

原创不易,未经允许不得转载!

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

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

相关文章

长春高中计算机考试时间安排,长春部分高中期末考试时间出炉!

原标题:长春部分高中期末考试时间出炉!上次跟大家分享了中小学的放假时间,今天就来说说期末考试时间吧!虽然有的学校时间未定,但是按照惯例,长春市各大高中高一高二年级,本次的期末考试时间&…

用习惯了windows系统要怎样去认识linux系统(一)

一、前言对于普通用户来说99%都使用的是windows操作系统,即便那些会使用linux系统的技术员来说,他们PC上安装的也是windows系统。linux系统只是用于服务器市场,可以说现在服务器市场80%使用的是linux系统。那它们两系统之间有哪些区别呢&…

VAssistX使用小窍门

日常使用中的一些VAssistX使用小窍门,简单总结下 一,修改VAssistX默认缓存文件路径,防止默认C盘被占用空间过大 1、 打开注册表HKCU\Software\Whole Tomato,新建UserDataDir,数值为要修改的路径,如下图&am…

多个 gradle 文件夹 \.gradle\wrapper\dists\ 设置gradle不是每次都下载

韩梦飞沙 韩亚飞 313134555qq.com yue31313 han_meng_fei_sha 设置gradle不是每次都下载 \.gradle\wrapper\dists\ 在你导入项目的时候,有个选项的: 你要是选了Use default gradle mapper就会下载一次,Use local gradle distribution就会…

vb获取数组长度_如何实现数组的二分查找

二分查找是一种极其高效、简练的查找算法,它不仅简单,易用,而且还非常的高效。相对于顺序查找,二分查找在效率是呈现指数性提升,数据量越大,越能体现出二分查找法的优势。二分查找的查找过程是:…

所给服务器端程序改写为能够同时响应多个客户端连接请求的服务器程序_一文读懂客户端请求是如何到达服务器的...

点击上方“蓝色字体”,选择 “设为星标”关键讯息,D1时间送达!互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCP/IP协议。那么TCP/IP是如何工作的呢,我们先从数据包开始讲起。1、数据包一、HTTP…

消息服务器 推送技术,SSE服务器推送技术

SSE即 server send event 服务器发送事件,在在早期可能会使用ajax向服务器轮询的方式,使浏览器第一时间接受到服务器的消息,但这种频率不好控制,消耗也比较大。但是对于SSE来说,当客户端向服务端发送请求,服…

无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...

wifi密码被别人改了怎么办?wifi密码之所以被别人修改,是因为其他人知道了你路由器的登录密码。所以,如果发现自己wifi密码被别人修改了,应该立刻登录到路由器设置界面,修改路由器登录密码、修改wifi密码、并调整wifi加…

CentOS7 Firewall NAT 及端口映射

本节介绍用CentOS7的Firewalll来做NAT以及端口映射实验拓扑:因为我的环境里CentOS7上有KVM虚拟机需要共享网卡上网,所以我把网卡都添加到了桥里面,当然这里也可以不用桥,直接用物理网口;用nmcli创建桥,并添加网口到桥&…

JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)

LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试。尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇到不少意料之外的错误。 为了方便各位猿友编译,LZ临时…

另一个域的cookie_一定要知道的第一方Cookie和第三方Cookie

Cookie 是您访问过的网站创建的文件,用于存储浏览信息,例如您的网站偏好设置或个人资料信息。共有两种类型的 Cookie:第一方 Cookie 是由地址栏中列出的网站域设置的 Cookie,而第三方 Cookie 来自在网页上嵌入广告或图片等项的其他…

苹果手机怎么连接不了无线网络连接服务器,苹果手机连接wifi显示无互联网连接怎么办?...

在开始对网络操作以后,也可尝试着把 iPhone 重新启动一下,按下 iPhone 电源键不放,直到出现关机选项并滑动关机,最后再开机。在 iPhone 的无线局域网列表中,当前连接的这个无线网络显示“无互联网连接”。此时可以通过…

git学习心得之从远程仓库克隆

现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库: $ git clone gitgithub.com:michaelliao/gitskills.git Cloning into gitskills... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) R…

2018-2019 20165208 网络对抗 Exp3 免杀原理与实践

目录 2018-2019 20165208 网络对抗 Exp3 免杀原理与实践实验内容基础问题回答实践过程记录任务一:正确使用免杀工具或技巧任务二:通过组合应用各种技术实现恶意代码免杀任务三:用另一电脑实测,在杀软开启的情况下,可运…

k均值例子 数据挖掘_人工智能、数据挖掘、机器学习和深度学习的关系

一、人工智能人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。实际应用比如:机器视觉,指纹识别,人脸识别,视网膜识别,虹膜识…

软件系统换服务器地址,天正软件客户端修改服务器地址

天正软件客户端修改服务器地址 内容精选换一换如果IP经过NAT/WAF,则只能获取到NAT/WAF转化后的IP地址,无法获取到NAT/WAF前的IP地址。如果客户端为容器,只能获取到容器所在主机的IP地址,无法获取容器的IP。四层监听器(TCP/UDP)开启…

选中下拉列表显示全部数据_小白都能学会的多级下拉列表,让你的Excel效率提升百倍...

私信回复关键词【工具】,获取Excel高效小工具合集!让你的Excel效率开挂~你有没有遇到过这样的场景?收集上来的各部门工作进度表,里面的答案五花八门。即使在表头上进行提示规范,手动输入也十分低效。有没有什么办法能够…

lightgbm 数据不平衡_不平衡数据下的机器学习(下)

本文从不平衡学习的基础概念和问题定义出发,介绍了几类常见的不平衡学习算法和部分研究成果。总体来说,不平衡学习是一个很广阔的研究领域,但受笔者能力和篇幅的限制,本文仅对其中部分内容做了简单概述,有兴趣深入学习…

netty实现高性能文件服务器,通用文件服务组件(Netty实现版本)

本文所述文件服务组件在笔者此前一篇文章中已有阐述(基于netty的文件上传下载组件),不过本文将基于之前这个实现再次进行升级改造,利用基于注解的方式进行自动装配。1. 简介1.1 Netty简介Netty是一个异步事件驱动的网络应用程序框架,用于快速…

PHP 小数点保留两位【转】

最近在做统计这一块内容&#xff0c;接触关于数字的数据比较多&#xff0c; 用到了三个函数来是 数字保留小数后 N 位&#xff1b; 接下来简单的介绍一下三个函数&#xff1a; 1、number_format echo number_format("5000000")."<br>"; echo number_…