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系统。那它们两系统之间有哪些区别呢&…

spring 配置文件模板

<?xml version"1.0" encoding"UTF-8"?><beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc"http://www.springframework.org/schema/mvc" xmlns:context"http://www.springframework.org/schema…

VAssistX使用小窍门

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

react 交互_如何在React应用程序中跟踪用户交互

react 交互by Faouzi Oudouh通过Faouzi Oudouh 如何在React应用程序中跟踪用户交互 (How to track user interactions in your React app) Worry not about which Analytics provider you need to gather user interaction within your app.不必担心需要哪个Analytics(分析)提…

shell python比较_shell中的条件判断以及与python中的对比

shell中比如比较字符串、判断文件是否存在及是否可读等&#xff0c;通常用"[]"来表示条件测试。注意&#xff1a;这里的空格很重要。要确保方括号的空格。if ....; then python中的条件判断&#xff1a; if ....: (此处是冒号&#xff0c;不同…

服务器麒麟系统能设置mtu吗,麒麟操作系统安装标准手册-20210405220006.docx-原创力文档...

精品文档精品文档PAGEPAGE47精品文档PAGE.银河麒麟V3操作系统安装手册V1.2编制&#xff1a;王帅校核&#xff1a;朱本亮审定&#xff1a;周俊...文档更新日志&#xff1a;序号修订时间修订内容修改人审定人012017-04-12发布文档V1.0王帅周俊022017-05-11增加启动安装时蓝屏错误…

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

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

docker使用方式

docker使用方式安装&#xff1a;1.安装依赖 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 2添加yum源 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安装 yum install docker-ce docker-ce-cli contain…

使用AxiosJavaScript中的简单HTTP请求

Interested in learning JavaScript? Get my ebook at jshandbook.com有兴趣学习JavaScript吗&#xff1f; 在jshandbook.com上获取我的电子书 介绍 (Introduction) Axios is a very popular JavaScript library you can use to perform HTTP requests. It works in both Brow…

Linux中通过命令直接删除文件中最后一行

何谓Sed(Stream EDitor):Sed原为UNIX系统上的非交谈式文字编辑器(non-interactive stream editor)。当Sed读入待编辑文件&#xff0c;会依编辑命令来进行文件的编辑工作。sed -i $d file如同其它UNIX的指令一般&#xff0c;Sed亦是由标准输入(standard input)读入欲编辑的文件&…

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

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

400错误返回了服务器信息,使用Spring MVC,接受JSON错误的POST请求会导致返回默认的400错误代码服务器页面...

我正在使用RESTAPI。接收到带有错误JSON的POST消息(例如{sdfasdfasdf})会使Spring返回默认服务器页面&#xff0c;以显示400错误请求错误。我不想返回页面&#xff0c;我想返回自定义JSON错误对象。当使用ExceptionHandler引发异常时&#xff0c;可以执行此操作。因此&#xff…

【Python】list和tuple 区别比较

列表 List classmates [Michael, Bob, Tracy] 元组 Tuple tuple一旦初始化就不能修改&#xff0c;比如同样是列出同学的名字&#xff1a; >>> classmates (Michael, Bob, Tracy) 现在&#xff0c;classmates这个tuple不能变了&#xff0c;它也没有append()&#xff…

leetcode315. 计算右侧小于当前元素的个数(树状数组解法)

leetcode315. 计算右侧小于当前元素的个数(树状数组解法) 题目&#xff1a;给定一个整数数组 nums&#xff0c;按要求返回一个新数组 counts。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 树状数组解法 java class Solution …

洛谷 P1101 单词方阵

给一nn的字母方阵&#xff0c;内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8个方向的任一方向&#xff0c;同一单词摆放时不再改变方向&#xff0c;单词与单词之间可以交叉,因此有可能共用字母。输出时&#xff0c;将不是单词的字母用*代…

从头学习计算机网络_如何从头开始构建三层神经网络

从头学习计算机网络by Daphne Cornelisse达芙妮康妮莉丝(Daphne Cornelisse) 如何从头开始构建三层神经网络 (How to build a three-layer neural network from scratch) In this post, I will go through the steps required for building a three layer neural network. I’…

python 文件处理

f open(chenli.txt) #打开文件 first_line f.readline() print(first line:,first_line) #读一行 print(我是分隔线.center(50,-)) data f.read() # 读取剩下的所有内容,文件大时不要用 print(data) #打印读取内容f.close() #关闭文件1…

第五章 MVC之Bundle详解

一、简述 Bundle&#xff0c;英文原意就是捆、收集、归拢。在MVC中的Bundle技术&#xff0c;也就是一个对css和js文件的捆绑压缩的技术。 它的用处&#xff1a; 将多个请求捆绑为一个请求&#xff0c;减少服务器请求数 压缩javascript&#xff0c;css等资源文件&#xff0c;减小…

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

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