1. 异常是指程序在运行时发生的错误或不正常的状况。在不支持异常处理的计算机语言中,这些状况需要又程序员进行检测和处理。
异常类在java.lang包中。
根据错误性质可将运行错误分为两类:致命性的错误(Error)和非致命的异常(exception)。
2.编程错误的分类
ü编译错误(compilation error)
ü逻辑错误(logic error)
原因:在程序运行过程中,出现了不可能执行的操作。
解决方法:异常处理
原因:程序没有按照预期的方案执行
解决方法:利用调试技巧可以解决此类错误
原因:没有遵循语言的规则
解决方法:由编译程序检查发现
3. 运行时错误(runtime error)
在程序运行时出现的一些非正常的现象被称为运行时错误,如除数为0、数组下标越界、文件不存在、内存不够用等等。
分类:根据错误性质将运行时错误分为两类
(1)致命性的错误(错误处理一般由系统承担,语言本身不提供错误处理机制;灾难性故障,由Java虚拟机生成并抛出给系统。通常,Java程序不对错误进行处理)
例:程序进入了死循环、递归无法结束、内存溢出等,这些运行错误是致命性的错误,只能在编程阶段解决,运行时程序本身无法解决,只能依靠其他程序干预,否则会一直处于非正常状态。
(2)非致命性的异常(是可以检测和处理的,所以产生了相应的异常处理机制;是用户程序能够捕捉到的“异常”情况,由Java程序抛出和处理的 )
例:除数为0、操作数超出数据范围、文件并不存在、欲装入的类文件丢失、网络连接中断等,这类现象称为非致命性的异常。
4. 异常处理的类层次
Java中预定义了很多异常类,每个异常类代表一种运行错误。
5. 常用Exception类的子类:
异常类
|
描述
|
NullPointerException
|
空指针异常
|
ArrayIndexOutOfBoundsException
|
数组越界访问异常
|
ClassNotFoundException
|
试图访问一个根本不存在的类
|
IOException
|
输入/输出异常
|
NumberFormatException
|
错误的类型转换异常
|
ArrayStoreException
|
当向数组存入错误类型数据时
|
ArithmeticException
|
除数为0的算术异常
|
6. try语句后面必须跟一个catch语句或finally语句,不能单独存在。
类名、方法名(包括主方法)、文件名和错误行数都会包括在一个简单的堆栈轨迹中。
7.抛出异常throw:
在程序发生异常时,产生一个异常事件、生成一个异常对象,并把它交给运行时系统。再由运行系统寻找相应的代码来进行处理,这个过程称为:抛出异常;一个异常对象可以由java虚拟机生成,也可以由运行的方法生成。异常对象包含了异常事件类型、程序运行状态等必要的信息。
异常捕获
运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应处理代码的方法,并把异常对象交给该方法,来处理这一异常。这一过程称为:捕获异常。
8. 使用try-catch-finally语句捕获和处理异常
尽管系统提供的默认异常处理程序对于调试非常有用,但多数情况下用户仍然希望能自己处理异常。这样做的好处有:用户能自行修改错误;能有效防止程序的自动终止。
格式:try{
//产生异常的语句(包含可能引发异常的语句)
}catch(异常类1 变量){
//异常处理代码(对异常进行处理的代码)
}catch(异常类2 变量){
//异常处理代码
}[finally{
}
µ try语句块
ü将程序中可能出现异常的代码放入try块中。
ü当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。
ü如果try块中没有语句引发异常,则程序执行完try块中的语句后不执行catch块中的语句,即跳过catch语句,继续执行后面的程序。
µ catch块
ü每个try语句后面必须伴随一个或多个catch语句(或finally语句),用于捕捉try语句块所产生的异常并作相应的处理。
ücatch子句的目标是解决“异常”情况,并像没有出错一样继续运行。
注意:一个try和它的catch语句组成了一个单元。catch子句的范围限制于try语句块中的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。被try保护的语句声明必须在一个大括号之内。try语句块不能单独使用。
µ多个catch块
一个catch块只能处理一类异常,当try块中的语句组可能抛出多种异常时,就需要有多个catch块来分别处理各种异常。
ü一个异常对象能否被一个catch块接收主要看该异常对象与catch块中声明的异常类的匹配情况,当它们满足下面条件中的任一条时,异常对象将被接受:
异常对象是catch块中声明的异常类的实例;
异常对象是catch块中声明的异常类的子类的实例;
异常对象实现了catch块中声明的异常类的接口。
ü当使用多个catch块时,需注意catch子句排列顺序--先特殊到一般,也就是子类在父类前面。如果子类在父类后面,子类将永远不会到达。
9. try语句的嵌套
一个try语句可以在另一个try块内部----try语句的嵌套。
ü每次进入try语句,异常的前后关系都会被压入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。
ü这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。
ü如果没有catch语句匹配,Java的运行时系统将处理这个异常。
10.finally语句块
ü某些情况下,不管异常是否发生,都需要处理某些语句,那么就将这些语句放到finally语句块中。finally语句所包含的代码在任何情况下都会被执行。
ü一个try语句至少有一个catch语句或finally语句与之匹配,但匹配的catch可以有多个,而finally语句只能有一个,并且finally语句并非必须有的。
finally语句总被执行,不管有没有return语句跳出。
1. 抛出异常
Java运行时系统引发的异常
根据需要人工创建并抛出
人工抛出异常(被抛出的必须是Throwable或其子类的对象)
语法格式:throw 异常类对象;
例如:IOException e = new IOException();
throw e;( 程序执行throw语句后立即终止,然后在包含它的所有try块中从里向外寻找含有与其类型匹配的catch子句。)
2. 声明抛弃异常
µ如果一个方法中的代码在运行时可能生成某种异常,但是在本方法中不必要,或者不能确定如何处理此类异常时,则可以使用throws声明抛弃异常;
µ表明该方法中将不对此类异常进行处理,而由该方法的调用者负责处理;
µ即系统将在调用该方法的上层方法体内寻找合适的异常处理代码,而不再继续执行该方法的正常处理流程。
µ声明抛弃异常的格式
类型 方法名([参数表]) throws 异常类型,…{
//方法体;
}
3. 虽然Java的内置异常处理能够处理大多数常见错误,但用户仍需建立自己的异常类型来处理特殊情况。这时可以通过创建Exception的子类来定义自己的异常类。
格式:class 类名 extendsException{
… … }
分析:Exception类自己没有定义任何方法。但它继承了Throwable提供的一些方法。 例如,
public StringgetMessage(); public voidprintStackTrace();
4. 在Java中,对异常进行处理需要考虑以下因素:
µ如果异常事件是在运行时产生的,并且在JDK API中没有与该异常事件相对应的异常对象,则应创建用户自定义类型的异常对象。
µ如果可以预测异常对象的类型并且该异常是在程序运行时发生的,则建议应用JDKAPI中定义的系统异常类型,并且可以抛出这种类型的异常对象由JVM处理。
µ如果不能确定异常对象的类型以及异常发生的时机,则应该采用系统类型异常对象并由JVM处理。
µ对应用程序设计失误导致的数组越界、非法变量等类型的异常,如果要全部捕获所有类型的异常对象,会增加系统开销,导致程序的运行效率降低,建议应用程序可以不对此类异常进行捕获,而交由JVM进行处理。
µ对于实现输入/输出处理、网络通讯和数据库访问功能的代码,必须进行异常对象的捕获和处理 。
5. 从JDK1.4版本开始,Java语言引入了断言(assert)机制。
目的:程序调试(测试代码或者调试程序时,总会做出一些假设,断言就是用于在代码中捕捉这些假设 )
表现形式:断言就是程序中的一条语句,它对一个boolean表达式进行检查(一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态,系统给出警告或退出)
6. 如果没有断言机制,Java程序通常使用if-else或switch语句进行变量状态检查。缺点:
µ由于检查的数据类型不完全相同,这样的语句形式不会统一。
µ因为检查仅仅是应用在测试阶段,而if-else或switch语句在发布以后仍然将起作用,如果消除这些代码就意味着要注释或者删除这些代码,如果这些代码量很大就意味着工作很繁重并存在风险。
使用断言的优点:
µJava程序员用统一的方式处理状态检查问题;
µ断言只需在发行的时候关闭该功能即可。
7. 断言的开启和关闭
µ在默认情况下断言是关闭的,因此在使用断言以前,需要先开启断言功能,方法:
java–eaMyClass 或者
java –enableassertions MyClass
µ关闭断言功能的方法:
java–daMyClass 或者
java –disableassertions MyClass
µ注意:断言检查通常在开发和测试时开启。为了提高性能,在软件发布后,断言检查通常是关闭的。
8. 断言的使用
Java中使用关键字assert标记断言,语法格式为:
µassert Expression1
执行到assert语句时,如果Expression1的值为true,则程序正常执行,如果值为false,该语句创建一个Assertion Error对象,并抛出该对象。
µassert Expression1:Expression2
当断言失败时,系统会自动将Expression2的值传递给新建的AssertionError对象,进而将其转换为一个消息字符串保存起来,可以获得更多、更有针对性的检查失败细节信息。
注意:这两种格式都必须是boolean表达式
9. 什么时候使用断言
µ通常来说,断言用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响。
µ断言表达式应该短小、易懂,如果需要评估复杂的表达式,应该使用函数计算。
µ使用断言的情况
ü检查控制流:在if-else和switch语句中,可以在不应该发生的控制支流上加上assert语句。如果这种情况发生了,assert能够检查出来。
ü在私有方法计算前,检查输入参数是否有效
对于一些private的方法,要求输入满足一些特定的条件,可以在方法开头使用assert进行参数检查;对于公共方法,通常不使用断言检查
ü在方法计算后,检查方法结果是否有效
ü检查程序不变量
有些程序存在一些不变量,可能是一个简单表达式,也可能是一个复杂表达式。在程序的运行声明周期,这些不变量的值都是不变的,对于一些关键得不变量,可以通过assert进行检查。
private boolean isBalance() {
……
}//assert isBalance():"balance is destoried";
10. ThrowableInstance是Thowable或Thowable子类的一个对象,简单类(如int、char)以及非Throwable类(如String、Object)不能再thow语句中。
程序执行到thow语句后会立即终止,后面的语句不再被执行,然后在包含它的try块中从里向外寻找含有与其类型匹配的catch子句。
Java内置的运行异常都有两个构造方法,一个没有参数,一个带有一个字符串参数。当使用第二种形式时,参数指定描述异常的字符串。如果异常对象用作print()或println()的参数,则该字符串被显示。
如果一个方法可能导致,某个异常但不准备处理它时,就必须指定某种行为以使方法的调用者可以保护他们,要做到这点,必须在方法声明中包含一个throw子句。throw子句通常列举了一个方法可能引发的所有异常类型。这对于除Error、RuntimeException及其子类之外的所有其他异常都是很重要的。这些其他类型的异常必须在throw子句中声明,如果不这样做,将会导致编译错误。
分享到:
相关推荐
Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...
Java 异常详解 Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在...
本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计...
Java 异常机制的基础知识包括异常的基础概念、异常的分类、异常的对象、异常的来源、异常的处理等几个方面。 一、Java 异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以...
java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验
Java异常处理是Java编程语言中的一个关键特性,它允许程序员优雅地处理程序运行时出现的错误情况,确保程序的稳定性和可靠性。这份“Java异常学习资料”包含了丰富的资源,帮助你深入理解Java异常机制,提升代码质量...
Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误情况时能够优雅地进行错误恢复或者至少提供有用的错误信息。Java异常是程序在运行时遇到的问题,例如数组越界、空指针异常、文件未找到等,这些问题...
这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供但无法直接访问)可能详细解释了Java异常处理的基本概念、机制以及最佳实践。 Java异常...
这篇博文“Java异常框架设计”可能探讨了如何有效地利用Java的异常处理机制来构建可靠的系统。在这个讨论中,我们将深入理解Java异常的基本概念、异常分类、以及如何通过良好的框架设计提升代码的可读性和可维护性。...
java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理
Java异常处理主要涉及以下几个核心概念: 1. **异常(Exception)**:异常是程序在执行过程中遇到的非正常情况,它中断了正常的执行流程。Java中的异常以对象的形式存在,这些对象通常是特定异常类的实例。异常分为...
在给定的“Java异常分装实例”中,我们可以学习如何创建自定义异常类、抛出和捕获异常,以及如何利用Java的异常层次结构。`exception_test`文件可能包含了一个或多个示例代码,用于演示这些概念。 首先,创建自定义...
Java异常框架是Java编程语言中处理程序运行时错误和异常的核心机制。在Java中,异常是一种特殊的对象,用于表示程序运行过程中的不正常状态。Java的异常处理模型基于\"异常处理块\",包括try、catch、finally和throw...
本文将对C++和Java两种语言的异常处理机制进行深入的比较和分析,探讨它们的相似之处以及不同之处,以帮助开发者更好地理解和应用这两种语言。 首先,异常处理的基本目的是捕获并处理运行时错误,这些错误通常包括...
第7章 java异常处理
Java异常处理是编程中至关重要的一个环节,它帮助开发者识别并修复程序运行时出现的问题。在Java中,异常是程序执行期间发生的不正常情况,通常会导致程序中断。下面将详细解释给定文件中提到的一些常见Java异常,并...
Java异常处理是Java编程中一个至关重要的概念,它关乎到程序的健壮性和稳定性。在Java语言中,异常处理提供了一种机制,使得程序在遇到错误或非正常情况时能够优雅地处理问题,而不是突然崩溃。这个“java高端技术...
Java异常处理是Java编程语言中的一个关键特性,它允许程序员优雅地处理程序运行时可能出现的错误和不正常状况。在Java中,异常是程序执行过程中出现的问题,它们中断了正常的控制流程,使得程序无法继续按照预期的...