当前位置: 首页 > 编程日记 > 正文

《疯狂Java讲义》学习笔记(十)异常处理

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

0、Java的异常体系

3d70355e9eddf297b2bded98bcaf7833528.jpg

1、异常概述


异常机制已经成为判断一门编程语言是否成熟的标准,目前主流的编程语言都提供了成熟的异常机制,增加了异常处理机制后的程序有更好的容错性,更加健壮
Java的异常机制主要依赖于:try、catch、finally、throws和throw
Java7进一步增强了异常处理机制的功能,包括带资源的try语句、捕获更多异常的catch
Java将异常分为两种,Checked异常和Runtime异常,Checked异常都是可以在编译阶段被处理的异常,程序强制要求处理;而Runtime异常是运行时产生的异常


2、异常处理机制


使用try…catch捕获异常 
try{…}catch(Exception e){…} 
如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出(throw)异常 
当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的则把该异常对象交给该catch块处理,这个过程被称为捕获异常,否则运行时环境终止,Java程序也将退出


3、异常的继承关系


Java把所有非正常情况分成两种:异常(Exception)和错误(Error),它们都是继承Throwable父类
Error错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断;通常应用程序无法处理这些错误,因此也无法捕获
开发中常遇到的内存溢出是属于错误(Error) 
第一种:OutOfMemoryError: PermGen space内存空间不足,如一次性加载太多信息,或加载项目太多 
第二种:OutOfMemoryError: Java heap spacejava虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了 
第三种:OutOfMemoryError:unable to create new native thread一般很少出现,可能由于分配给JVM内存与系统本身比例问题引起
Java7可以提供更多异常捕获 
try{…}catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie){…}
访问异常信息 
getMessage():返回该异常的详细描述字符串 
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出 
printStackTrace(PrintStream s):将该异常的跟踪信息输出到指定输出流 
getStackTrace():返回该异常的跟踪栈信息


4、finally块

try{...
}catch(Exception e){...
}finally{...
}


不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return、throw语句,finally块总是被执行
异常处理语法结构中只有try块是必须的,catch块和finally块都是可选的,但两者至少出现其中之一;可以有多个catch块,catch块必须位于try之后,finally必须位于所有catch块之后;
如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,则finally块将失去执行的机会
在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,否则会导致try块、catch块中的return、throw语句失效


5、Java7自动关闭资源的try语句

try(BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));){System.out.println(br);
} catch (Exception e) {e.printStackTrace();
}


Java7增强了try语句的功能,允许在try关键字后紧跟一对圆括号声明、初始化一个或多个资源,try语句在该语句结束时自动关闭这些资源;而且这些资源实现类必须实现AutoCloseable或Closeable接口,实现这两个接口就必须实现close()方法
以上的BufferedReader都是实现了Closeable接口的,即使没有finally块也会自动关闭资源


6、Checked异常和Runtime异常体系


所有的RuntimeException类及其子类的实例被称为Runtime异常;非RuntimeException类及其子类的异常实例则被称为Checked异常
Checked异常处理方式: 
当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后再对应的catch块中修复该异常 
当方法不知道如何处理这种异常,应该在定义该方法时抛出该异常
Runtime异常则无须显示声明抛出,程序也可以通过try…catch块来捕获


7、使用throws声明抛出异常

public class ThrowsTest{public static main(String[] args)throws IOException{FileInputStream fis = new FileInputStream("a.txt");}
}

  • 当前方法不知道如何处理这种类型异常时可以使用throws声明抛出异常
  • 使用throws声明抛出异常时有一个限制:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出异常不允许比父类方法声明抛出的异常多


8、使用throw抛出异常


当程序出现错误时,系统会自动抛出异常,除此之外,Java也允许程序自行抛出异常,使用throw语句来完成


9、自定义异常类


用户自定义异常都应该继承Exception基类,如果系统自定义Runtime异常,则应该继承RuntimeException基类

public class MyException extends Exception{public MyException(){}public MyException(String msg){super(msg);}publc MyException(Throwable t){super(t);}
}


10、catch和throw同时使用


为了实现通过多方协作处理同一个异常的情形,可以在catch块中结合throw语句来完成,将异常传递给下一个程序 
Java7可以直接将捕获的异常直接传递:

try{new FileOutputStream("a.txt");
}catch(Exception ex){ex.printStackTrack();throw ex;
}


11、异常链

public calSal() throws MyException{try{...}catch(Exception e){throw new MyException(e);}
}


12、异常处理规则

  • 成功的异常处理应该实现4个目标:

使程序代码混乱最小化 
        捕获并保留诊断信息 
        通知合适的人员 
        采用合适的方式结束异常活动

  • 避免过度依赖异常:

把异常和普通错误混淆在一起,不再编写任何错误处理代码 
        使用异常处理来替代流程控制

  • 不要使用过于庞大的try块

应该把大块的try块分割成多个可能出现异常的程序段落,并把它们放在单独的try块中

转载于:https://my.oschina.net/fairy1674/blog/2908047

相关文章:

PAT(甲级)2018年冬季考试 7-1 Google Recruitment

1. 本题是 substrsscanf的绝佳实践。 2. 判断素数使用i*i<n与i<(int)sqrt(0.1*x)的区别是前者可能再n接近10的9次方时溢出&#xff0c;但本题不会。 3. 尽管把字符串转变成了整数&#xff0c;但输出时仍旧输出字符串&#xff0c;如果选择打印整数&#xff0c;会遇到%0K…

MySQL 的“root”用户修改密码

MySQL 的“root”用户默认状态是没有密码的&#xff0c;所以在 PHP 中您可以使用 mysql_connect("localhost","root","") 来连接 MySQL 服务器&#xff1b;如果您想为 MySQL 中的“root”用户设置密码&#xff0c;请在控制台中使用“mysqladmin”…

游戏AI之初步介绍(0)

目录 游戏AI是什么&#xff1f;游戏AI和理论AI智能的假象&#xff08;更新&#xff09;游戏AI和机器学习介绍一些游戏AI4X游戏AI《求生之路》系列角色扮演/沙盒游戏中的NPC游戏AI 需要学些什么&#xff1f;自治智能体群体智能感知状态机&#xff08;重要&#xff09;行为树&…

Google Adsense实用防踢技巧总结

我们都知道&#xff0c;对个人草根站长来说&#xff0c;Google AdSense是网站收入的主要来源之一&#xff0c;我在这里介绍一些常用的技巧。 希望通过这些技巧能够增加大家的Google AdSense收入&#xff0c;并防止自己的帐号被删除。大家喜欢的话就顶下吧&#xff01; 广告的位…

PAT(甲级)2018年冬季考试 7-3 Vertex Coloring

1. 起先我的思路是&#xff0c;对于每一种方案&#xff0c;把相同颜色的下标放到一个集合&#xff0c;对于每一个集合判断里面的元素互相之间是否有着邻接关系。有一个用例超时&#xff0c;20/25。 2. 转变思路&#xff0c;对于每一种方案&#xff0c;遍历邻接关系&#xff0c…

蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路

小蚂蚁说&#xff1a;当前&#xff0c;数字化信号已经逐渐深入到社会的每个角落&#xff0c;影响着用户的心智和行为&#xff0c;来到数字化时代门口的银行&#xff0c;需要注意到数字化信号。西安银行通过引入蚂蚁金服移动开发平台mPaaS&#xff0c;对手机银行进行架构升级&am…

(四十七)Quartz2D引擎初步

Quartz2D是跨平台的&#xff0c;同时支持iOS与Mac。 支持圆型裁剪&#xff0c;可以实现圆形头像等功能&#xff0c;也支持手势解锁、折线图等的制作。 对于复杂的UI界面&#xff0c;还可以通过Quartz2D将控件内部的结构画出来&#xff0c;可用于自定义控件。 实际上iOS大部分控…

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT

目录 体会 代码(非满分) 改进 AC代码 体会 这题主要是考察对STL中string,map,vector的应用以及自定义sort()应用。 类型1和2的处理很容易。 类型3要求对于指定date&#xff0c;按照每个考场进行分类&#xff0c;记录不同考场的人数&#xff0c;按照人数非升序&#xff…

DOS、Mac 和 Unix 文件格式+ UltraEdit使用

文件格式 区分DOS、Mac 和 Unix分别对应三种系统从文件编码的方式来看&#xff0c;文件可分为ASCII码文件和二进制码文件两种文件模式 区分ASCII模式和Binary模式 通常由系统决定&#xff0c;大多数Linux/UNIX系统只有两种模式&#xff1a;文本模式和二进制模式。文本传输器使用…

灰度图像--图像分割 Scharr算子

学习DIP第46天 转载请标明本文出处&#xff1a;http://blog.csdn.net/tonyshengtan &#xff0c;出于尊重文章作者的劳动&#xff0c;转载请标明出处&#xff01;文章代码已托管&#xff0c;欢迎共同开发&#xff1a; https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习…

FileUpload生成图片水印,文字水印(转载)

/** <summary>/// 生成缩略图/// </summary>/// <param name"originalImagePath">源图路径&#xff08;物理路径&#xff09;</param>/// <param name"thumbnailPath">缩略图路径&#xff08;物理路径&#xff09;</para…

1151 LCA in a Binary Tree (含求LCA的通法)

目录 解法一思路 结果 解法一改进 解法一改进结果 ​解法二思路 解法一代码 解法一改进代码 解法二代码(AC) 解法一思路 1. 根据先序和中序建树 2. 对树进行深度优先遍历&#xff0c;找到每一个结点的父节点(注意&#xff1a;由于值的范围是int&#xff0c;直接用可…

cf 414B Mashmokh and ACM 动态规划

题目链接&#xff1a;http://codeforces.com/problemset/problem/414/B dp[i][j]表示长度为i、最后一个数字为j的合法序列总数 dp[1][1...2000]都是1 后面用dp[i-1][j] 去更新 dp[i][j*t] (1 < j*t < 2000) 即用因子去更新它的倍数 表面上看是2000^3的复杂度会爆 其实不用…

解决:angularjs radio默认选中失效问题

添加ng-model后checked"checked"失效&#xff0c;可见angularjs也不好&#xff0c;会失效html标准属性解决&#xff1a;添加ng-checked"1"<input type"radio" ng-model"sel_course" value"1" ng-checked"1" /…

在ireport报错 报 jdk5找不到的解决办法

在ireport安装目录下&#xff0c; etc目录下有ireport.conf&#xff0c; 其中有jkdhome设置&#xff0c; 把前面的#&#xff08;注释&#xff09;去掉&#xff0c; 换成自己的jdk目录就行 双引号不要去掉 jdk地址放在双引号之间 比如 改成 jdkhome"G:/ACD/jdk1.5.0&quo…

如何通过中序和层序序列建立二叉树

有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 7 11 28 8 运行结果 这个过程和建立二叉查找树(BST)的过程是非常相像的&#xff0c;将laSq[laIndex]插入到根为root的子树中&a…

BZOJ 3573 米特运输

Description 米特是D星球上一种非常神秘的物质&#xff0c;蕴含着巨大的能量。在以米特为主要能源的D星上&#xff0c;这种米特能源的运输和储存一直是一个大问题。 D星上有N个城市&#xff0c;我们将其顺序编号为1到N&#xff0c;1号城市为首都。这N个城市由N-1条单向高速通…

[学习笔记]最小割之最小点权覆盖最大点权独立集

最小点权覆盖 给出一个二分图&#xff0c;每个点有一个非负点权要求选出一些点构成一个覆盖&#xff0c;问点权最小是多少 建模&#xff1a; S到左部点&#xff0c;容量为点权 右部点到T&#xff0c;容量为点权 左部点到右部点的边&#xff0c;容量inf 求最小割即可。 证明&…

10分钟学会Google Map API

http://space.itpub.net/14734354/viewspace-374828 前几天玩了玩Google的Map API&#xff0c;感觉还不错&#xff0c;很简单。但凡有过任何编程经验的同学&#xff0c;看完以下的教程&#xff0c;都可以在10分钟内掌握它的主要功能。另外我还做了个简单的小例子&#xff0c;有…

1143 Lowest Common Ancestor(建树与不建两种思路)

目录 解法一 解法二 解法一 这题可以不建树&#xff0c;直接利用BST的性质&#xff1a;左子树<根节点<右子树&#xff0c;对先序序列进行遍历&#xff0c;如果有某个元素大于等于u,v中较小的且小于等于u,v中较大的&#xff0c;则可能是根节点。 这题数据弱&#xff0…

UIScrollView

UIScrollView&#xff08;包括它的子类 UITableView 和 UICollectionView&#xff09;是 iOS 开发中最常用也是最有意思的 UI 组件&#xff0c;大部分 App 的核心界面都是基于三者之一或三者的组合实现。UIScrollView 是 UIKit 中为数不多能响应滑动手势的 view&#xff0c;相比…

MySQL练习题:常用函数

1. 以首字母大写&#xff0c;其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名4. 用#来填充员工职位job的结尾处&#xff0c;按10个字符长度输出。5. 去除字符串 hello world 两边的空格&#xff0c;并将单词间的空格改…

我的WINCE4.2历程(10)

2010-04-02 今天的主要工作&#xff1a; 1&#xff09;RTC4513驱动调试&#xff0c;又做了一些尝试&#xff08;检查GPIO口的第二功能设置是否正常&#xff09;&#xff0c;结果还是不正常&#xff0c;FAINT。 2&#xff09;回顾了截止到目前取得的进展&#xff1a; a&#xff…

1069 The Black Hole of Numbers

注意两点&#xff1a; 1. 不足4位要补足&#xff0c;不仅仅是一开始要考虑&#xff0c;每次得到一个差值&#xff0c;都要考虑 2. 到0也会停下&#xff0c;不仅仅是一开始可能发生&#xff0c;也可能是过程中的某一个差值 另&#xff1a; vector<int> 是可以作为函数…

详解Asp.net MVC DropDownLists

来自网络&#xff1a; Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面面. DropDownList,ComboBox,无论你喜欢怎么称呼这些&#xff0c;他们毫无例外的会被生成…

3D中的OBJ文件格式详解(转载)

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导&#xff0c;也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型&#xff0c;想把它…

比特币测试网络搭建

转自 https://blog.csdn.net/yzpbright/article/details/81004202 比特币 一、安装 Docker 二、安装和运行比特币测试网络(bitcoin-testnet) 1.下载比特币测试网络(bitcoin-testnet)的Docker镜像 docker pull freewil/bitcoin-testnet-box 2.运行Docker镜像 docker run -t -i -…

1136 A Delayed Palindrome 需再做

注意点&#xff1a; 1. 大整数即高精度整数&#xff0c;数据结构bign要会定义 2. 记得写构造函数或者通过别的方式初始化bign 3. len属性记得手动更新 4. int d[maxn]数组是顺位存储&#xff0c;意味着字符串要逆序读入 AC代码 #include<cstdio> #include<iostr…

ES5-Array-push(),pop(),shift(),unshift()

参考文章&#xff1a;push()&#xff0c;pop() push方法用于在数组的末端添加一个或多个元素&#xff0c;并返回添加新元素后的数组长度。 注意&#xff0c;该方法会改变原数组&#xff0c;而不是创建一个新的数组。var arr [];arr.push(1) // 1 arr.push(a) // 2 arr.push(tr…

visual studio 2005 新建C++空项目无法调试的解决方案

(1)项目属性→配置属性→链接器从→调试→生成调试信息→将“否”改为“是(/DEBUG)”。(2)项目属性→配置属性→C/C→调试信息格式→将“禁用”改为“用于编辑并继续的程序数据库(/ZI)”。(3)项目属性→配置属性→C/C→优化→优化→将“最大化速度(/O2)”改为“禁用(/Od)”。转…