1. 异常机制
异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。
异常处理的流程:
① 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象 。
② 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码 。
异常的分类:
① 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
② Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
每个类型的异常的特点
Error体系 :
Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。
Exception体系包括RuntimeException体系和其他非RuntimeException的体系 :
① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
未检查的异常:派生至Error类和RuntimeException类的所有异常类(图中红色所示)。
已检查的异常:除未检查的异常类之外的异常类 (图中黄色所示) 。
与C++异常分类的不同 :
① Java中RuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的。(在编译时出现的错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误)。
② C++中logic_error与Java中的RuntimeException是等价的,而runtime_error与Java中非RuntimeException类型的异常是等价的。
3 异常的使用方法
声明方法抛出异常
① 语法:throws(略)
② 为什么要声明方法抛出异常?
方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
③ 为什么抛出的异常一定是已检查异常?
RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常。遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。
注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。
如何抛出异常
① 语法:throw(略)
② 抛出什么异常?对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是ClassCastException,那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名能够明确说明异常情况的类。
③ 异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。
④ 创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。需要注意的是,唯一有用的就是类型名这个信息,所以不要在异常类的设计上花费精力。
捕获异常
如果一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;对于一个图形界面程序,也会输出异常的信息,但是程序并不中止,而是返回用错误页面。
语法:try、catch和finally(略),控制器模块必须紧接在try块后面。若掷出一个异常,异常控制机制会搜寻参数与异常类型相符的第一个控制器随后它会进入那个catch 从句,并认为异常已得到控制。一旦catch 从句结束对控制器的搜索也会停止。
捕获多个异常(注意语法与捕获的顺序)(略)
finally的用法与异常处理流程(略)
异常处理做什么?对于Java来说,由于有了垃圾收集,所以异常处理并不需要回收内存。但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源。
应该声明方法抛出异常还是在方法中捕获异常?原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常。
再次抛出异常
①为什么要再次抛出异常? 在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。
②异常处理流程 :对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级。
4 关于异常的其他问题
① 过度使用异常 :首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
② 将异常与普通错误区分开:对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
③ 异常对象中包含的信息 :一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。
分享到:
相关推荐
标题《Java异常分类.pdf》表明本文档旨在介绍Java编程语言中异常的分类。异常是程序在运行时出现的非正常情况,它会打断正常的程序流程。在Java中,所有的异常都是通过Java异常类体系来处理的。根据异常在Java中的...
Java异常处理是编程中至关重要的一个部分,它用于管理和恢复程序执行过程中可能出现的错误或异常情况。当程序遇到无法预见的问题,如文件未找到、网络连接中断或计算溢出等,Java通过异常处理机制来优雅地处理这些...
### Java异常处理详解 #### 一、异常的概念与分类 在Java编程中,异常处理是一项重要的技术,它有助于提升程序的稳定性和健壮性。异常是程序运行过程中发生的错误或异常情况的一种表现形式,比如除零错误、文件未...
Exception 子类根据错误发生的原因来分类的话,分为两个分支——RuntimeException 类和非 RuntimeException 类,RuntimeException 是程序员编写程序不正确所导致的异常;而非 RuntimeException 类则是由于一些异常的...
5. **异常处理**:讨论了Java的异常处理机制,包括异常的分类、捕获、抛出以及自定义异常。 6. **集合框架**:深入解析了Java集合接口和类,如List、Set、Map以及它们的实现,包括ArrayList、LinkedList、HashSet、...
#### 四、异常分类 ##### 1. 运行时异常 - 运行时异常是`RuntimeException`类及其子类的实例。 - 这些异常通常是由于程序逻辑错误导致的,比如数组越界、空指针引用等。 - 运行时异常通常不需要显式处理。 示例:...
Java 异常详解 Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在...
### JAVA异常详解 #### 一、什么是异常? 在Java编程语言中,“异常”是指程序运行过程中出现的问题或错误状态,这些问题可能由系统错误、非法操作或其他不可预知的情况引起。根据异常的不同特性,它们可以被分类...
### Java异常详解 #### 标题与描述解读 在Java编程语言中,异常处理机制是一项重要的功能特性,它能够帮助开发者有效地捕捉并处理程序运行时出现的问题或错误情况。本篇文档《Java异常详解》旨在深入探讨Java中的...
【异常分类】Java异常类继承自`java.lang.Throwable`,主要分为`Exception`和`Error`两个顶级父类。`Exception`类又分为`Checked Exception`(检查型异常)和`Unchecked Exception`(运行时异常)。检查型异常是编译...
Java异常处理是编程中至关重要的一个环节,它用于管理和修复程序运行时可能出现的错误。Java提供了丰富的异常处理机制,以确保程序在遇到错误时能够优雅地处理,而不是导致程序崩溃。这一章节主要介绍了Java编程中两...
Java异常编程是Java语言中一个至关重要的部分,它关乎程序的稳定性和健壮性。异常是程序运行时发生的错误,可以被程序捕获并进行适当的处理,而不是导致程序崩溃。在Java中,异常处理机制是通过try-catch-finally...
5. **异常处理**:深入理解异常分类,如何有效地捕获和处理异常,以及如何设计和使用自定义异常。 6. **输入/输出流**:涵盖文件I/O,对象序列化,以及使用FileInputStream、FileOutputStream、BufferedReader、...
计算机后端-Java-Java核心基础-第17章 异常处理 07. 异常的分类.avi
本文将对Java异常的概念、分类、处理方式、常见异常类型、自定义异常以及相关的面试题进行详尽的阐述。 1. 什么是异常、异常的分类? 异常是程序执行过程中发生的非正常情况,它中断了正常的控制流程。在Java中,...
Java异常框架处理是Java编程中十分关键的一部分,主要涉及到Java异常类的层次结构、异常的分类、异常的处理方式,以及如何在实际开发中使用异常框架来处理各种运行时错误。 首先,我们需要了解Java的异常类的层次...
Java 异常的分类: * 编译时异常:继承自 Exception,编译阶段就报错,必须处理。 * 运行时异常:继承自 RuntimeException,编译阶段不报错,运行阶段才可能出现。 常见的运行期异常包括: * 数组索引越界异常:...
Java异常体系是Java编程语言中一个至关重要的组成部分,它提供了优雅的方式来处理程序运行时可能出现的错误情况,确保程序的健壮性和可用性。异常处理机制允许开发者将正常的业务逻辑代码与错误处理代码分离,提高...
1、异常分类:按照异常的类型和严重性,分类处理不同的异常。 2、异常处理逻辑:设计合适的异常处理逻辑,尽量恢复程序的正常运行。 3、异常记录:记录异常的信息,以便后续的分析和 debug。 4、异常测试:对异常...
- 异常分类:通过异常类对异常进行分类,便于识别和处理不同类型的错误。 - 分离异常逻辑:将异常处理代码与正常流程分开,使代码更清晰,更容易维护。 - 异常传播:如果当前方法无法处理异常,可以将异常向上抛出,...