摘要:Java有3种抛出异常的形式:throw、throws、系统自动抛异常。

本文分享自华为云社区《Java-throw异常详解以及过程》,作者: gentle_zhou 。

首先,我们知道Java有3种抛出异常的形式:throw(执行的时候一定抛出某种异常对象), throws(出现异常的可能性,不一定会发生), 系统自动抛异常。

throw用在一个语句抛出异常的时候,throw (an instance of exception class)比如一个方法/函数里,try{…}catch(Exception e){throw new ArithmeticException(“XXX”);}finally{…};

throws则是用在声明方法可能抛出异常的时候,throw (exception class)比如public int division(int x, int y) throws ArithmeticException {…};

系统自动抛异常则是当程序语句出现逻辑错误,主义错误或类型转换错误的时候,系统自动抛出异常,比如int a = 5; int b = 0; c = a/b; 这个时候移动会自动抛出ArithmeticException。

什么是异常

异常,顾名思义,就是有异于正常状态,有错误发生。而这错误会阻止Java当前函数方法的运行。

那么Java里面异常的体系是怎么样的呢?

1.Java里面所有不正常类都继承于Throwable类;而Throwable类包括2类:Error类和Exception类。

2.Error类包括虚拟机错误(VirtualMachineError)和线程死锁(ThreadDeath)。

3.Exception类则是我们在说的异常;包括运行时异常(RuntimeException)和检查异常;这里的异常通常是编码,环境,用户操作输入出现了问题。

4.运行时异常(RuntimeException)包括以下4种异常:空指针异常(NullPointerException),数组下标越界异常(ArrayIndexOutOfBoundsException),类型转换异常(ClassCastException),算术异常(ArithmeticException)。

空指针异常:

数组下标越界异常:

类型转换异常:

算术异常:

5.最后剩下的检查异常则是剩下各种异常的集合;这里发生异常的原因有很多,文件异常(IOException),连接异常(SQLException)等等;和运行时异常不同的是,这里的异常我们必须手动在代码里添加try…catch…(finally…)语句来捕获处理。

今天又了解学习到了一些具体的额外的异常:

Throw抛出异常详细过程

和throws声明方法可能会发生异常不同,throw语句则是直接抛出一个异常。

前面有提到,throw (an instance of exception class),这里的一个exception类的实例其实也可以说是一个ExceptionObject(Throwable类或则其子类 的对象;也可以是自定义的继承自Throwable的直接或间接的异常类)。如果,我们用了throw new String(“异常XXX”); 则会在编译的时候报错,因为String 类并不是Throwable类的子类。

接着让我们回到怎么用throw语句的阶段。

一般我们有两种方式来用throw:直接在某处会发生异常的地方用throw语句 或则 用try…catch…finally…语句来捕获处理异常和关闭释放资源。

首先是第一种,直接在某处会发生异常的地方用throw语句;这是一种主动的方法,主动抛出异常去处理。而第二种,用try…catch…finally…语句来捕获处理异常和关闭释放资源 则是被动的方法。try里面放入可能会发生异常的语句块,如果在运行期间遇到了异常,则会交给catch来处理异常(catch可以是多个,处理不同的异常),finally则是无论有没有异常发生,只要加上了就会运行。

首先我们来看第一种方法的函数:

我们的int c = 4/2,其实是正确的;但是我们的throw 语句主动抛出了异常,那么程序就会到catch里面找有没有这个异常,有的话进行处理。所以我们要主动抛异常的话,要很确信这个代码一定会发生异常且后期不太会去变动了(最好放在if条件语句里)。所以我们得到的结果如下:

接着我们来看第二种方法。我们一开始先测正确的,只是把主动抛出异常语句给注释掉:

因为try里面的语句块没有异常,所以只执行了try和finally里面的语句块。运行的结果如下:

我们接着来测当try里面的语句块有异常,且没有主动抛出异常的时候,try会不会捕捉到异常吧:

得到的结果如下,会去处理异常和执行finally里面的语句块:

最后深入理解一点try里面的异常触发会逐层向上的这个概念。在我们try语句里主动/被动抛出异常的时候,程序会调向调用者程序(上面的例子里就是我们自己这个函数;但有的时候我们会在try语句里执行别的函数比如B,这个函数B里我们假如触发了异常,它会调向try语句所在的函数A),寻找和它相匹配的catch语句,执行catch语句里面相应的异常处理程序;但假如没有找到相匹配的catch语句,那么它会再转向上一层的调用程序…这样逐层向上,直到最外层的异常程序终止程序并打印出stack trace。

点击关注,第一时间了解华为云新鲜技术~

解析Java-throw抛出异常详细过程的更多相关文章

  1. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  2. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

  3. 【转】Java学习---解析Java Servlet工作过程

    [原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. java 异常体系详细介绍

    一.异常概述与异常体系结构 异常:在Java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误和逻辑错误不是异常). Java把异常当作对象来处理,并定义一个 ...

  6. C++使用throw抛出异常

    引用:    c++ 使用throw抛出异常 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常.该语句的格式为:throw 表达式; ...

  7. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

    前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票 ...

  8. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  9. 浅析java程序的执行过程

    在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要.  何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...

随机推荐

  1. Dubbo telnet 命令能做什么?

    dubbo 服务发布之后,我们可以利用 telnet 命令进行调试.管理. Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 连接服务 telnet localhost 20880 ...

  2. 什么是IOC?

    IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传 ...

  3. python面向对象--快速入门

    1面向对象基本用法 1.1基本格式 class 类名: def __init__(self,x): self.x = x def 方法名字 (self): #函数在类里称为方法,self就是固定参数, ...

  4. DASCTF Oct吉林工师web

    迷路的魔法少女 进入环境给出源码 <?php highlight_file('index.php'); extract($_GET); error_reporting(0); function ...

  5. IPhoneX网页布局简介

    IPhoneX全面屏是十分科技化的,但是由于其圆角和摄像头刘海位置以及操控黑条的存在使得我们需要去对其样式做一些适配,没有X的同学可以开启 Xcode 9 的iPhone X 模拟器作为学习和调试. ...

  6. 破解浏览器同源政策利器之JSONP

    本文是在了解了浏览器的同源规则之后,学习了破解这个规则的一个简单有效的方法->JSONP.主要通过阮一峰老师的博客学习 浏览器的同源规则 有这样一个背景,如果你通过银行的网站进行的取钱的交易,而 ...

  7. 基于 WPF和ASP.NET Core 在线音视频聊天项目

    Dimension 基于 .NET 6 的在线音视频聊天项目 WPF和ASP.NET API开发 使用第三方依赖介绍 公用依赖 log4net 日志记录. SignalR 用于服务器与客户端的通讯手段 ...

  8. python-正整数的因子展开式

    [题目描述]编写程序,输出一个给定正整数x(x>1)的质因子展开式. [输入格式]请在一行中输入整数x的值. [输出格式]对每一组输入的x,按以下格式输出x的质因子展开式(假如x的质因子分别为a ...

  9. CCF201312-2ISBN号码

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-&qu ...

  10. 网络协议之:socket协议详解之Unix domain Socket

    目录 简介 什么是Unix domain Socket 使用socat来创建Unix Domain Sockets 使用ss命令来查看Unix domain Socket 使用nc连接到Unix do ...