Java异常与处理机制
Java异常与处理机制
Java的异常层次体系
Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception。
Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Error的错误,程序除了通告给用户并尽量安全退出外也无能为力。
Exception分支才是程序员主要在意的异常,它又分为RuntimeException和IOException两个分支。
RuntimeException通常是由于程序错误导致的。
IOException通常程序本身没有问题,但由于像I/O错误等问题导致的。
Java规范将Error分支和RuntimeException分支的异常称为非受查异常,其他异常称为受查异常。
抛出异常
程序员在编写代码时若遇到无法处理的情况(受查异常),可以选择抛出异常,将问题交给程序的调用者解决。
在方法名后用throws语句声明异常告诉调用者代码会抛出什么异常,若需抛出多个异常时就必须列出所有的异常类用逗号隔开。一个方法必须声明所有肯抛出的受查异常。例如:
public void read()throws FileNotFoundException,EOFException
在方法中使用throw语句抛出异常,例如:
throw new IOException();
捕获异常
抛出异常是一种异常的解决方案,但不是最终方案。如果异常没有得到处理程序就会崩溃终止,因此需要捕获异常。Java提供了try/catch语句捕获异常。
如果try语句中发生了异常,则停止执行try块中的代码转而执行catch块中的代码,捕获读个异常时需为每个异常提供catch语句处理且catch语句自上到下要与异常继承链相同由子到父,还可以合并catch语句用‘|’合并捕获多个异常。
复制代码
try {
code
} catch (FileNotFoundException | UnknownHostException e) {
exception handler
} catch (IOException e){
exception handler
}
复制代码
finally语句:若程序出现异常时,就会终止方法中剩余的代码并退出方法。如果方法获得了一些资源并且只有方法自己知道,就会产生资源回收问题。Java提出finally子句的解决方案,不管异常如何处理,finally子句一定会被执行。
处理异常时的几种代码执行顺序:
复制代码
try{
code1 code that might throw exceptions code2
}catch(Exception e){
code3 code that might throw exceptions code4
}finally{
code5
}
code6
复制代码
try块代码无异常,执行顺序为1,2,5,6
try块代码中出现异常,catch语句中没有出现异常,执行顺序为1,3,4,5,6
try块代码中出现异常,catch语句中也出现异常,执行顺序为1,3,5
带资源的try语句
对于实现了AutoCloseable或Closeable接口的资源,Java提供了带资源的try语句,当try块退出时,资源自动调用close()方法。
带资源的try语句(try-with-resources)的形式为:
try(Resource res = ...){
// code work with res
}
AutoCloseable接口有一个close方法,它抛出一个Exception异常
void close() throws Exception;
Closeable接口继承自AutoCloseable接口 也有一个close方法,它抛出一个IOException异常
public void close() throws IOException;
断言
在检查受查异常时,通常会使用大量输出语句进行测试,这些语句在测试完毕后依然会留在程序中,如果程序中留有这些大量的检查语句会导致程序运行变慢。
在jdk1.4中引入了断言机制,它允许在开发和测试阶段在代码中插入一些检查语句检测异常。由于Java虚拟机默认断言是关闭的,因此在项目发布后不影响程序的运行。
断言的使用
assert 条件;
assert 条件:表达式;
当条件结果为false时,抛出AssertionError异常,在第二种形式中表达式会传入AssertionError类的构造器中形成一个消息字符串。
在测试中使用-enableassertions或-ea开启断言。
举个栗子:
Scanner in = new Scanner(System.in);
int x = in.nextInt();
assert x>0:x;
double y = Math.sqrt(x);
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python入门基础(9)__面向对象编程_2
Python入门基础(9)__面向对象编程_2__str__方法如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以利用__str__这个内置方法了 注意:__str__方法必须返回一个字符串 复制代码class Cat(): def __init__(self,name): self.name = name print('小猫 %s 来了'%self.name) def __str__(self): return '%s 爱吃鱼'%self.name 创建对象,将参数传进去 a = Cat('汤姆')print(a)复制代码结果: 小猫 汤姆 来了汤姆 爱吃鱼 私有属性---封装有时候对象的属性或方法我们只希望在对象的内部被使用,而不希望在外部被访问到 定义方式 在定义属性或方法时,在属性名或者方法名前增加两个下划线__,其实在开发过程中,私有属性也不是一成不变的.所以要给私有属性提供外部能够操作的方法 通过自定义get,set方法提供私有属性的访问 复制代码class Person(): def __init__(self,name,age): self.n...
- 下一篇
Hybrid App从概念到实战
Hybrid App从概念到实战目录 JSBridge是个啥H5 和 Native 的双向通信通用方法H5调用Native方法Native调用H5方法通信原理总结H5 和 Native 通信实战总结 最近一直在准备找工作,看了很多公司的招聘介绍,有相当一部分直接写:熟悉 Hybrid App 开发加分!正好,我司开发的就有这种 Hybrid App——使用WebViewJavascriptBridge通信,前端封装一些常用方法调用。 现在的 app 开发,已经不在是以前一样所以页面都是有原生开发,基于应用的更新上线繁琐,由于 H5 的易更新,易维护性, 现在很多应用都采用同 H5 页面混合开发模式,例如:淘宝、QQ、京东等等。下面就来看看 Native 和 H5 如何实现通信: 回到顶部JSBridge是个啥直接来重点,记住:JSBridge 是一个很简单的东西,更多的是一种形式、一种思想,为了解决 H5 和 Native 的双向通信。 就像我们刚接触 ajax 时,也很懵逼。其实,他们俩个差不多,ajax 是浏览器和服务器通信的规范(暂且叫规范,像CMD规范一样,SeaJS是它的一种...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8