Java编程思想之通过异常处理错误
- 异常分为被检查的异常和运行时异常,被检查的异常在编译时被强制要求检查。异常被用来错误报告和错误恢复,但很大一部分都是用作错误报告的。
- 异常情形是由于当前环境下无法得到必要的信息导致当前方法或作用域无法继续执行。当抛出异常时,首先在堆上创建了异常对象,其次当前的执行路径中止并在当前环境中弹出对异常对象的引用,此时异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。
- 异常最重要的方面之一是如果发生了问题,将不允许程序沿着其正常路径继续走下去。
- 所有标准异常类有两个构造器,一个是默认构造器,一个是接受相关信息字符串在为参数的构造器。异常类型的根类是Throwable类,错误信息可以保存在异常对象的内部或用异常类的名称来暗示。
- 异常处理程序紧跟在try块之后,以关键字catch表示。每个catch字句是只接受一个特殊类型的参数的方法。异常处理理论有两种模型:终止模型和恢复模型。
- 自定义异常来表示程序中可能碰到的特定问题,通过继承已有的异常类。System.err是标准错误流,不会重定向,而System.out可能会重定向。异常类调用了了在Throwable类声明的printStackTrace()方法,将打印“从异常抛出处到方法调用处”的方法调用序列。
- Java.util.logging工具将输出记录到日志中去。显示日志的方法是调用与日志记录消息级别相关的方法severe()。记录其他人编写的异常并生成日志的方法不同点:e.printStackTrace();
- 异常说明数据方法声明的一部分,紧跟在形参之后。其使用了throws复数关键字,后面接一个异常类型构成的列表。代码必须与异常说明一致。如果代码产生了异常,要么处理这个异常,要么在异常说明中表明此方法将产生异常。
- 可以声明方法将抛出异常,实际上却不抛出。这样就为异常先占了位子,以后就可以抛出这种异常而不用修改已有的代码,主要用在定义抽象基类和接口时。
- 使用基类Exception可以捕获所有异常。
- 把刚捕获的异常重新抛出,异常对象的所有信息都得以保持。也可以捕获异常后抛出另外一种异常。
- 异常链:捕获异常后抛出另外一种异常,并保存原始异常的信息。三种基本的异常类带有带cause参数(表示原始异常)的构造器,是Error,Exception和RuntimeException。两种方式:1. 带cause参数(表示原始异常)的构造器,2.没有此构造器的异常类型,通过initCause()方法来把异常链接起来。
- 属于运行时异常的类型有很多,它们自动被Java虚拟机抛出,所以不必在异常说明中列出来,称为不受检查的异常,代表编程错误,将被自动捕获。但尽管通常不用捕获RuntimeException异常,但还是可以在代码中抛出RuntimeException类型的异常。如果RuntimeException类型的异常没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrace()方法。
- 当要把除内存之外的资源恢复到它们的初始状态时,就要用到finally子句。异常没被当前处理程序捕获,但会运行finally字句。甚至在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finally子句。当涉及continue和break语句时,也会执行finally子句。当涉及return时,先执行finally子句,再执行return。
- 异常忽略丢失:try块中抛出的异常被finally子句抛出的异常所取代,被catch语句捕获到。如果直接在try-finally语句的finally字句中执行return,try块抛出的异常也会被忽略。
- 当覆盖方法时,只能抛出在基类方法的异常说明里列出的那些异常(及子类)。但是异常限制对构造器不起作用,子类的构造器可以不必理会基类构造器所抛出的异常。子类的构造器的异常声明必须包含基类构造器的异常声明。派生类的构造器不能捕获基类构造器抛出的异常。强制派生类遵守基类方法的异常声明。派生类可以不抛出任何异常,即使它是基类所定义的异常。因为异常说明本身不属于方法类型的一部分,因此不能基于异常说明来重载方法。一个出现在基类方法的异常说明的异常,不一定会出现在派生类方法的异常说明里。
- 如果在构造器内抛出了异常,清理方法也许不能正常工作。对于创建对象的语句置于外部的try块中,如果构造失败,将进入外部的catch字句。如果构造成功,则确定对象能被清理,因此在构造之后,进入内部的try-catch-finally或try -finally块,finally字句执行清理工作。基本原则是:在创建需要清理的对象之后,立刻进入try -finally块。对于一群不能失败的构造器的对象来说,从构造和清理出发,可以群组在一起。当对于那些具有可以失败的构造器对象来说,得嵌套。
- 异常匹配:抛出异常时,异常处理系统会按照代码的书写顺序找到最近的处理程序,找到后,就默认异常会被处理,即使异常没有被捕获,然后就不会在继续查找了。
- 被检查的异常强制你在没有准备好处理错误时候被迫加入catch字句,导致吞下异常。解决方法:1. 通过给main方法throwsException来把异常传递给控制台。2. 可以把被检查的异常包装在RuntimeException里面,再throw出来,保证了既不需要写try-catch块,因为没有抛出被检查的异常,也包装了不会丢失任何原始异常的信息。但是如果准备捕获异常的时候,还是可以用try块来捕获你想要的异常。
- 与恢复功能相比,报告功能才是异常的精髓所在。Java坚定强调将所有的错误都以异常的形式报告这一事实。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python全栈 Web(CSS样式表、选择器)
CSS层叠样式表: (Cascading Style Sheet) 作用: 装饰和美化页面元素,实现网页的排版布局 CSS为HTML标记语言提供了一种样式描述,定义了其中元素的显示方式。 CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素 CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力 使用: 1.行内样式/内联样式: 特点: 在具体的标签中使用参style属性,引入CSS的样式的代码 语法: <标签 style=“CSS” 样式声明> 1)样式声明/CSS语句: 对当前元素添加样式 语法: CSS属性:值; 2) CSS的样式声明可以是多条 <标签 style=“属性:值; 属性:值;”> 常见的CSS属性: 1》.设置字体大小 属性: funt-size 取值: 以像素为单位的数值 默认16px 2》.设置字体颜色 属性: color 取值: 颜色的英文单词 3》.设置背景颜色: 属性: back...
- 下一篇
《Python编程:从入门到实践》 第5章习题
#5-1 条件测试:编写一系列条件测试;将每个测试以及你对其结果的预测和实际结果 #都打印出来。你编写的代码应类似于下面这样: car = 'subaru' print("Is car == 'subaru'? I predict True.") print(car == 'subaru') print("\nIs car == 'audi'? I predict False.") print(car == 'audi' + "\n") #5-2 更多的条件测试:你并非只能创建10个测试。如果你想尝试做更多的比较,可再编写 #一些测试,并将它们加入到conditional_tests.py中。对于下面列出的各种测试,至少编写 #一个结果为True和False的测试。 #略 #5-3 外星人颜色#1:假设在游戏中刚射杀了一个外星人,请创建一个名为alien_color #的变量,并将其设置为'green'、'yellow'或'red'。 alien_color = 'green' if alien_color == 'green': score = 5 if alien_color ==...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库