java 异常处理机制(java 编程思想)

一、概念 

  • “异常”这个词有“我对此感到意外”的意思。问题出现了,你也许并不清楚该如何处理,但你的确知道不应该置之不理;你要停下来,看看是不是有别人或在别的地方,能够处理这个问题。只是在当前的环境中还没有足够的信息来解决这个问题,所以就把这个问题提交到一个更高级别的环境中,在这里将作出正确的决定。

二、基本知识

2.1 基本异常

  • 当抛出异常后,首先,同Java中其它的对象创建一样,将使用 new在堆上创建异常对象。然后,当前的执行路径(它不能继续下去了)被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续运行下去。异常允许我们(如果没有其它手段)强制程序停止运行,并告诉我们出现了什么问题,或者(理想状态下)强制程序处理问题,并返回到稳定状态。

  在基本异常的基础之上,我们还需要知道异常的参数:

  • 我们总是用 new 在堆上创建异常对象,这也伴随着存储空间的分配和构造器的调用。所有标准异常类都有两个构造器:一个是默认构造器;另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器: 

      throw new NullpointerException("t = null "); 

  • 在使用 new 创建异常对象之后,此对象的引用将传给 throw。将会返回一个异常对象然后退出方法或作用域。
  • 能够抛出任意类型的Throwable对象,它是异常类型的根类。通常,对于不同类型的错误,要抛出相应的异常。错误信息可以保存在异常对象内部或者使用异常类的名称来暗示。上一层环境通过这些信息来决定如何处理异常。(通常,异常对象中仅有的信息就是异常类型,除此之外不包含任何有意义的内容。)

2.2 捕获异常

  try 块捕获异常

  如果在方法内部抛出了异常(或者在方法内部调用的其他方法抛出了异常),这个方法将在抛出异常的过程中结束。要是不希望方法就此结束,可以在方法内设置一个特殊的块来捕获异常。

  catch块处理异常

  当然,抛出的异常必须在某处得到处理。这个“地点”就是异常处理程序,而且针对每个要捕获的异常,得准备相应的处理程序。异常处理程序紧跟在 try 块之后,以关键字 catch 表示:

try{//Code that might generate exceptions
}catch(Type1 id1){//handle exceptions of Type1
}catch(Type2 id2){//handle exceptions of Type2
}
//etc...

  异常处理程序必须紧跟在 try 块之后。当异常被抛出时,异常处理机制将负责搜寻参数与异常类型相匹配的第一个处理程序。然后进入 catch 子句执行,此时认为异常得到了处理。一旦 catch 子句结束,则处理程序的查找过程结束。注意,只有匹配的 catch 子句才能得到执行。

  两种异常处理模型: 终止模型、恢复模型

  终止模型: 一旦异常被抛出,就表明错误已经无法挽回,也不能回来继续执行。

  恢复模型: 异常处理程序的工作是修正错误,然后重新尝试调出问题的方法,并认为第二次能成功。 该种模型时,不能再遇见错误时就抛出异常,而是调用方法来修正,或者把try块放在while循环里,这样不断的进入try块直到得到满意的结果。

2.3 创建自定义异常

  通过自定义MyException继承自Exception来创建自定义的异常。

class MyException extends Exception{public MyException(){}public MyException(String in){super(in);}
}

  并在catch中通过:

      e.printStackTrace()

将异常写入到System.err(标准错误流),在debug的时候会显示错误的函数和行号(这是对System.out的优势)。

(它将打印“从方法调用处直到异常抛出处”的方法调用序列)

栈轨迹:

  printStackTrace方法也可以通过getStackTrace()方法来访问,这个方法将返回一个由栈轨迹中的元素构成的数组,其中每一个元素都将表示栈中的一帧。

元素0是栈顶元素,并且是调用序列中的最后一个方法调用。

  通过如下代码打印 栈轨迹:

     try {f();} catch (MyException e) {//      e.printStackTrace();for(StackTraceElement ste : e.getStackTrace()){Log.d(TAG, "onClick: "+ste.getMethodName());}}

得到的结果如下:

  

 

2.4 异常说明

  如果调用某个方法,方法里的代码产生了异常却没有进行处理,编译器会发现这个问题: 要么处理这个异常,要么在函数异常说明中表明此方法将产生异常。

如下图所示: 1、函数声明加: throws MyException    2、函数中 增加 try catch 处理异常。 

2.5 try catch中有return,final?

  当try/catch代码中有return语句,那么此时的final是否还会继续执行?

       1、 当try catch中有return 语句,在执行return之前将需要return的结果保存在一个临时变量中,然后去执行finally代码块,执行完之后再执行return。

       2、 1中情况有个前提条件是finally中没有return语句,如果finally代码块中也有return,那么会执行finally中的return,不会执行try/catch中的。

int testFinallyReturn(){int x = 1;try{x++;return x;}catch (Exception e){return x;}finally {++x;return x;}}

运行结果:
if(exist("return x") in finally){
return result : 2 ;
}else{
  return result : 3 ;
}

转载于:https://www.cnblogs.com/NeilZhang/p/7639546.html

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

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

相关文章

怎样在CentOS 7.0上安装和配置VNC服务器

这是一个关于怎样在你的 CentOS 7 上安装配置 VNC 服务的教程。当然这个教程也适合 RHEL 7 。在这个教程里,我们将学习什么是 VNC 以及怎样在 CentOS 7 上安装配置 VNC 服务器 。 我们都知道 这是一个关于怎样在你的 CentOS 7 上安装配置 VNC 服务的教程。当然这个教…

MOTOMAN机器人网络控制的实现

最初程序员在Unix系统下使用Berkeley Socket编写网络程序,随着Windows操作系统的普及,Microsoft、Sun等公司联合开发了Winsock接口API。它实质上是一种进 程间通信,将之从单机环境扩展到网络环境以适合于开发主机/客户机通信程序。网络通信的…

【剑指offer】——【python中return函数中的and和or表达式的返回值】

目录 1、# and 结果为真,返回最后一个表达式的结果,若结果为假返回第一个为假的表达式的结果 2、# or 结果为真,返回第一个为真的表达式的结果,若结果为假,返回最后一个表达式的结果 3、应用[剑指 Offer 64. 求12…n…

Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】

2019独角兽企业重金招聘Python工程师标准>>> 之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息。实际上我们使用的对RabbitMQ的starter就是通过Spring C…

CXF 客服端调用报错

服务端已经发布了WSDL,现在在客服端生成web service客服端代码,在eclipse中新建一个project,然后new->web services->web service client生产客户端代码 在调用的时候报如下错误 解决:缺少axis相应的jar包,加入包…

20145225 《信息安全系统设计基础》第10周学习总结

cp1.c 进行复制文件的操作,需要有源文件和目的文件,第一次命令没有加入所以没有正常完成复制文件的操作fileinfo.c 用来实现显示文件信息。先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息&am…

做演员是圆梦 做生意学会面对现实

田朴珺是一位拥有多重身份的女性。她是一名演员,也是一位商人,还担任过电影《中国合伙人》的制片人。 作为演员,田朴珺的作品并不是很多,也一直不温不 火。但这并不代表她将放弃演艺生涯。她表示,如果机会合适&…

【深度学习】——模型评估指标MAP计算实例计算

目录 一、知识储备 1、IOU——交集面积与并集面积之比 2、混淆矩阵(TP、FP、FN、TN) 问题1:上面的TP等具体是如何计算得到的? 3、精度precision&召回率recall 二、ap计算实战 1、计算流程 1)准备数据&#xf…

第 52 章 Web Server Optimization

系统配置 Intel(R) Xeon(TM) CPU 3.00GHzMemory 4GEthernet adapter 1000M52.1. ulimit 查看 ulimit ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited pending signals …

hdu5489 Removed Interval dp+线段树优化

现在看这题居然直接秒了。。。去年看的时候还以为神题。。 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j]>a[i]的g[j]就可以了。注意到如果将f[i]从后往…

JS原型链理解

1. 每个对象都有原型属性(__proto__)2. 对象的原型(__proto__)指向其构造函数(Constructor)的prototype属性3. 构造函数(Constructor)的prototype属性本身也是一个对象,其原型(__proto__)亦指向其构造函数的prototype4. 如此形成一个链式结构,而Construc…

【深度学习】——2021年FPN特征金字塔

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/22 17:06 # Author : linlianqin # Site : # File : fpn.py # Software: PyCharm # description:其搭建的基本流程和resnet是一致的,只是将每一层的卷积结果保存了起来import torch impo…

NoSQL分类及ehcache memcache redis 三大缓存的对比

NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库。目前,可以将众多的NoSQL数据库按照内部的数据组织形式进行如下分类: Key/Value的…

52.4. APC Cache (php-apc - APC (Alternative PHP Cache) module for PHP 5)

$ apt-cache search php-apc php-apc - APC (Alternative PHP Cache) module for PHP 5$ sudo apt-get install php-apcapc cache 状态监控 http://pecl.php.net/package/APC 下载解包找到apc.php,放到web服务器上 原文出处:Netkiller 系列 手札 本文作者&#xff1…

乐视云计算基于OpenStack的IaaS实践

本文作者岳龙广,现在就职于乐视云计算有限公司,负责IaaS部门的工作。 从开始工作就混在开源世界里,在虚拟化方面做过CloudStack/Ovirt开发,现在是做以OpenStack为基础的乐视云平台。所以对虚拟化情有独钟,也对虚拟化/云…

【深度学习】——如何提高map值

目录 代码获取 map原理 map提高技巧 技巧总结: 实战: 1、效果不佳map55.55% 1)单独调整get_dr_txt.py中的self.iou 0.3 2)单独调整get_map,py中的minoverlap: 3)同时调整minoverlap和self.iou 本文是在faster_rcnn模型的…

每日站立会议个人博客(冲刺周)-Wednesday

时间未完成不知道如何获取具体标签里的内容正在做爬虫技术之获取标签里的内容将要做对运用爬虫技术获取的数据进行处理转载于:https://www.cnblogs.com/andibier/p/8075098.html

数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)...

第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横…

【深度学习】——纠错error: Unable to find vcvarsall.bat:关于安装pycocotools

1、安装包下载 大佬改写支持 Windows 的 COCO 地址:https://github.com/philferriere/cocoapi 下载后如下: 进入pythonAPI 先后运行: python setup.py build_ext --inplacepython setup.py build_ext install 出现以下标志时&#xff0c…

【小贴士】虚拟键盘与fixed带给移动端的痛!

前言今天来公司的主要目的就是研究虚拟键盘与fixed的问题,期间因为同事问起闭包与事件委托(阻止冒泡)相关问题,便穿插了一篇别的:【小贴士】工作中的”闭包“与事件委托的”阻止冒泡“,有兴趣的朋友可以去看…