程序异常异常代码: 0xc0000005_Java基础:看完这篇你还怕碰到异常吗?

c15ff2711e885931a6118045d2a0d36c.png

前言

在日常的开发以及平时的学习练习中,异常相信对于大家来讲并不陌生,但是对于异常的具体使用、底层实现以及分类等等可能并不是很了解。今天我就抽出了一点时间系统的整理了异常的各个知识点,希望能够帮助到大家对于Java 异常的理解与学习。

正文

一、异常的定义

异常:是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。我自己的的理解是异常通常是一种人为规定的不正常的现象,通常是写的程序产生了一些不符合规范的事情,而且异常一旦产品,程序直接挂掉。

二、异常的分类

通过我自己整理的这一张继承关系结构图,我们可以很清晰的看到异常这个庞大体系的继承关系。

9329f00fc55ae3e3523e8c69563929c2.png

其中我们可以看到 Exception类 下面又细分了两个分支(子类),分别是运行时异常(也称非检查异常[ Unchecked Exception ])和非运行时异常(也称检查异常[ Checked Exception ]),需要注意的是 Error 也是属于非检查异常。

1、运行时异常
运行时异常也称非检查异常,指的是 Error 和 RuntimeException 这两种。既然是叫运行时异常,那肯定是在程序运行期间才可能被检查出的异常,那自然编译器在编译的时候是不会检查此类异常的,并且不要求处理该类异常,所以此类异常也叫非检查异常(或者不检查异常),这一类异常一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

下图我整理了一些常见的运行时异常,如下表格所示:

fd97ff5bdcd2a0e489fe891caa3c714a.png

2、非运行时异常
非运行时异常指的是除开 Error 和 RuntimeException 极其子类之外的异常。既然叫做非运行时异常,顾名思义,就是不是在程序运行期间检查的异常,既然不是在程序运行期间检查,那就是编译器在编译期间就会检查此类异常,所以此类异常也叫检查异常(或者叫编译时异常)。此类异常在程序运行过程中极有可能产生问题,如果程序中出现此类异常(比如说 IOException ),必须对该异常进行处理,要么使用 try-catch 捕获,要么使用 throws语句抛出,否则编译不通过。

下图我整理了一些常见的非运行时异常,如下表格所示:

cc0bc7dc8c5f3c26b99b9aca2b3cf9c5.png

三、异常的处理

既然异常产生了,就需要我们去处理。处理异常不是让异常消失了,处理异常指的是处理掉异常之后,后续的代码不会因为此异常而终止执行,代码中的异常处理其实是对非检查异常也就是运行时异常的处理。

异常的处理有两种方式:捕获异常或者抛出异常这两种方式。

1、捕获异常,通过try…catch…finally(其中finally可有可无)语句块来处理
其中 try/catch 代码块放在异常可能发生的地方,把可能会发生异常的代码直接放到 try 块里面,如果在 try 块里面有异常发生,try 块代码里面后面的代码就不执行了,直接匹配 catch 里面的异常,如果没有异常发生, 就直接执行完try里面的代码,catch 里面的代码不执行。

try…catch 语法结构如下:

try{//程序代码
}catch (Exception e){}

其中 try 不能单独出现,后面必须添加 catch 或者 finally ,意思就是要么 try…catch,要么 try…finally,如下:

//写法1
try{//程序代码
}catch (Exception e){}
//写法2
try{//程序代码
}finally {}//写法3
try{//程序代码
}catch (Exception e){} finally {}

其中,catch 可以有多个存在

//程序代码
}catch (ArrayIndexOutOfBoundsException e1){//程序代码
}catch (IndexOutOfBoundsException e2){//程序代码
}catch (RuntimeException e3){//程序代码
}

其中 catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。如果catch 有多个,捕获的异常需要从小到大捕获。

关于try 、catch 、finally 关键字的执行顺序
我们先来看看下面代码的执行:

public static void main(String[] args) {System.out.println("try开始");String str = null;int length = str.length();System.out.println("try完毕");
} 

面代码的执行结果是:

try开始
Exception in thread “main” java.lang.NullPointerException
at com.example.javabasic.javabasic.ExceptionAndError.ExceptionTest.main(ExceptionTest.java:12)

再来看看下面代码的执行:

public static void main(String[] args) {System.out.println("程序最早开始执行");try{System.out.println("try开始");String str = null;int length = str.length();System.out.println("try完毕");} catch (ArrayIndexOutOfBoundsException e1){System.out.println("数组下标越界异常");}System.out.println("产生异常之后的所有程序");
}

上面代码的执行结果是:

Exception in thread “main” java.lang.NullPointerException
try开始
at com.example.javabasic.javabasic.ExceptionAndError.ExceptionTest.main(ExceptionTest.java:14)

再来看看下面的代价的执行:

System.out.println("程序最早开始执行");try{System.out.println("try开始");String str = null;int length = str.length();System.out.println("try完毕");} catch (NullPointerException e1){System.out.println("空指针异常");}System.out.println("产生异常之后的所有程序");
}

上面代码的执行结果是:

程序最早开始执行
try开始
空指针异常
产生异常之后的所有程序

通过上面三个例子,其实我们可以发现如果程序中如果有代码会出现异常,当你没有手动进行捕获的时候,当异常发生,代码直接中断,后面的代码也不会执行,当然这是显而易见的;如果你捕获了与之匹配的异常,那么在try块里面发生异常的后面的代码不会执行,位于try块之后的代码都会正常执行;如果你捕获了异常,但是发生的异常与你捕获的异常不匹配,程序也会立刻终止,后面的代码都不会执行。

try、catch、finally关键字的执行顺序的优先级是,try块中的代码会被执行,如果出现异常则执行最匹配的catch块。但是无论是否有匹配的catch块,只要有相关的finally块,那么finally块都会被执行,虽然finally块的优先级最低。

2、抛出异常,也就是在具体位置不处理,直接抛出,通过throws/throw到上层再进行处理。
当我们遇到可能发生的异常的时候,如果我们觉得自己手动处理太麻烦,自己不想处理怎么办呢?方法总比困难多,我们可以将异常抛出去,换而言之,就是丢给别人去处理,其中抛出异常有两种方式throws和throw。

第一种方式:throws声明异常
运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常,比如下面两个代码块

public static void main(String[] args) {try {testException();} catch (InterruptedException e) {e.printStackTrace();}
}private static void testException() throws InterruptedException {Thread.sleep(100);
}

或者:

public static void main(String[] args) throws InterruptedException {testException();
}
private static void testException() throws InterruptedException {Thread.sleep(100);
}

需要注意的是如果是主函数main方法调用了会抛出异常的方法,那么一般都是不建议主方法再抛出去的(如果主方法抛出去,就相当于抛给虚拟机处理了,然而虚拟机是不会处理的。),而是在主方法里进行捕获异常,再进行处理。

其中,throws抛出异常的时候可以抛出多个异常,通过逗号隔开,例如下方代码:

private static void testException() throws InterruptedException, ArrayIndexOutOfBoundsException, ArithmeticException{Thread.sleep(100);
}

第二种方式:throw抛出异常
用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行。

四、自定义异常

Jdk 提供了很多异常,其实基本都够我们平时的日常使用了,但是,当 Jdk 提供好的这些所有异常都不能描述或者满足我的问题的时候,我们其实可以自己定义一个异常来进行描述自己问题的异常,也就是自定义异常。自定义异常都必须是 Throwable 的子类,也就是:

继承 Throwable

继承 Exception

继承 RuntimeException

那么到底继承哪一个呢?看我们的需要,

如果希望写一个检查异常类,则需要继承 Exception 类或者 Throwable 类,一般继承 Exception 类。

如果希望写一个运行时异常类(也就是非检查异常),则需要继承 RuntimeException 类。

在平时开发中以及在项目上,一般都是选择继承 RuntimeException 类的,例如下面我定义一个自定义运行时异常:

/**
* 自定义运行时异常* @Date: 2020/4/21 9:54*/
public class MyRuntimeException extends RuntimeException{public MyRuntimeException(){}//如果想对自定义异常进行描述public MyRuntimeException(String message){super(message);}
}

测试一下自定义异常:

public static void main(String[] args){testMyRuntimeException();
}
/*** 自定义异常*/
private static void testMyRuntimeException() {throw new  MyRuntimeException("我的自定义异常");
}

执行结果为:

7ceabb362360b5f70ce489da0459887b.png

五、错误

Error 意思就是错误,Error 表示系统致命的错误,Error 是程序中无法处理的错误,表示运行应用程序中出现了严重的错误,通常是一些物理性的错误,这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。错误比如 JVM 虚拟机本身出现了问题、比如 StackOverFlowError 栈内存溢出、OutOfMemoryError 堆内存溢出等。在 Java 中,错误通过 Error 的子类描述。

总结:看完如果有什么问题欢迎在下面留言评论哦!

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

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

相关文章

写给初中级前端工程师的进阶指南

学习一门新技术的时候,最大的苦恼之一,大概就是不知道从何入手。典型的情况是,你大概知道学会以后,这门技术可以帮你解决什么问题。但是,怎么才能学会、循序渐进的学习路线是什么、学习范围有多大的深度和广度、涉及到…

千层套路 - Vue 3.0 初始化源码探秘

关注若川视野, 回复"pdf" 领取资料,回复"1",可加群长期交流学习刘崇桢,微医云服务团队前端工程师,左手抱娃、右手持家的非典型码农。9 月初 Vue.js 3.0 正式发布,代号 "One Piece"。大秘…

2020年大前端技术趋势解读

导Lead语如今的前端早已不再拘泥于满足页面展示,而是开始延展到通过全栈来闭环产品。这表明前端已经有能力透过业务深入产业,继而影响商业结果。这种表象的改变背后是本质的转变,从更为宏观的角度来说,前端正在通过持续的技术革新…

lc滤波器是利用电感的感抗_你对LC谐振电路你都了解吗

根据在电路中电感器L和电容C的连接方式不同,可以有两种LC谐振电路,LC并联谐振电路和LC串联谐振电路。LC并联、串联谐振电路在应用中的变化较多,是电路中分析的一个难点,只有掌握LC并联、串联电路的阻抗特性等基本概念,…

给小程序再减重 30% 的秘密​(京喜小程序首页瘦身实践)

前言—在 web 开发场景,减少代码体积虽然是性能优化的一个方向,还没到锱铢必较的程度。但是在小程序场景,由于代码包上传阶段限制了主包 2M 和总包 16M(近期微信官方正在内测将总包上限调整至 20M )的尺寸,…

本周ASP.NET英文技术文章推荐[10/21 – 10/27]

这一篇是《本周ASP.NET英文技术文章推荐》系列的第一篇,在这个系列中,我将介绍5-10篇比较有价值的、本周发布的、与ASP.NET相关的英文技术文章,帮助各位朋友从良莠不齐的大量文章中挑出一些我认为非常有价值阅读的,在进行一段简要…

3 年前端面经和他在创业公司的成长历程

在掘金上当了几年的伸手党,最近也准备输出一些自己的东西。关于我首先介绍一下我自己,17 年毕业于一所 211 学校,但是由于大学四年驰骋在召唤师峡谷,毕业时也没有找到一份大厂的工作,随便找了一家创业公司签了三方就去…

Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100

我们在第三篇中学习里一个简易的IoC框架。今天我们接着上次的程序,实现带参数构造函数对象的实例和属性的注入 。  我们知道可以通过反射获取类的构造函数及参数(GetConstructors方法);可以获取属性和属性的类型(GetProperties方法)。通过Activator的C…

android 单元测试

首先AndroidManifest.xml View Code <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.travelsky.test" android:versionCode"1"androi…

申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...

收评君复盘日记(2020年9月21日)三大指数集体收跌&#xff0c;北向资金全天大幅净流出近65亿元&#xff0c;军工板块表现强势。盘面回顾9月21日&#xff0c;两市全天高开低走&#xff0c;早盘指数弱势震荡&#xff0c;三大指数盘中一度翻红&#xff0c;但随后震荡走弱&#xff0…

若川的2016年度总结,毕业工作

可以点击上方的标签若川的故事、年度总结&#xff0c;查看往期文章有读者反馈说看我年度总结系列比我源码系列更有启发。所以打算把2016-2018的年度总结发布到公众号声明原创&#xff0c;希望对大家有所启发。&#xff08;虽然我的每一年都过得非常普通...&#xff09;以下是正…

jQuery之Ajax

转载链接&#xff1a;http://cargoj.iteye.com/blog/1008047 1 . jQuery帮助之Ajax请求&#xff08;一&#xff09;jQuery.ajax(options) 2 . jQuery帮助之Ajax请求&#xff08;二&#xff09;jQuery.get(url,[data],[callback] 3 . jQuery帮助之Ajax请求&#xff08;三&am…

面试官问:能否模拟实现JS的new操作符(高频考点)

可以点击上方的话题JS基础系列&#xff0c;查看往期文章这篇文章写于2018年11月05日&#xff0c;new模拟实现&#xff0c;Object.create是面试高频考点&#xff0c;之前发布在掘金有近2万人阅读&#xff0c;现在发布到公众号声明原创。1. 前言这是面试官问系列的第一篇&#xf…

跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

一、引言 上一篇博文分享了消息队列&#xff08;MSMQ&#xff09;技术来实现分布式应用&#xff0c;在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting。 二、.NET Remoting 介绍 2.1 .NET Remoting简介 .NET REmoting与MSMQ不同&#xff0c;它不支持离线可得&…

二叉树的建立与遍历_51、二叉树遍历-重建二叉树JZ4

题目描述输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。思路回顾三种经典的遍历&…

推荐关注这7个高质量的前端公众号

拓宽眼界&#xff0c;增加深度&#xff0c;在阅读的世界里&#xff0c;我们往往能找到不一样的态度&#xff0c;提升朋友圈质量&#xff0c;从关注这几个公众号开始。轻扫一下二维码就行了&#xff0c;你可以试试&#xff0c;肯定会有意外收获。大迁世界 简介&#xff1a;前端小…

Windows Live Writer 在win2003 的安装方法

下载Windows Live Writer整体安装包&#xff0c;最好是离线安装包 2.在xp系统上安装 3.查找C:\Program Files\Common Files\Windows Live\.cache目录 .cache目录是隐藏的&#xff0c;目录下面就是各个安装文件的msi安装包 4.拷贝相应的msi文件&#xff0c;到Windows 2003安装就…

decode 大于比较 小于_6 燃气输配系统6.3 压力不大于1.6Mpa的室外燃气管道城镇燃气设计规范 GB500282006(2020修订版)...

6.3 压力不大于1.6Mpa的室外燃气管道6.3.1中压和低压燃气管道宜采用聚乙烯管、机械接口球墨铸铁管、钢管或钢骨架聚乙烯塑料复合管&#xff0c;并应符合下列要求&#xff1a; 1 聚乙烯燃气管应符合现行的国家标准《燃气用埋地聚乙烯管材》GB15558.1 和《燃气用埋地聚乙烯管件…

若川的2017年度总结,一如既往

可以点击上方的标签若川的故事、年度总结&#xff0c;查看往期文章有读者反馈说看我年度总结系列比我源码系列更有启发。所以打算把2016-2018的年度总结发布到公众号声明原创&#xff0c;希望对大家有所启发。&#xff08;虽然我的每一年都过得非常普通...&#xff09;若川的20…

沟通:用故事产生共鸣

《沟通:用故事产生共鸣》(全彩) 基本信息作者&#xff1a; Nancy Duarte(南希.杜瓦特)译者&#xff1a; 冯海洋出版社&#xff1a;电子工业出版社ISBN&#xff1a;9787121195914上架时间&#xff1a;2013-4-1出版日期&#xff1a;2013 年3月开本&#xff1a;12开页码&#xff1…