1. 异常
1.1 概述
异常: 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.
异常发生时程序均会异常中断,而之前分配的所有资源则保持其状态不变。这会导致资源遗漏。要对异常适当处理,将以前系统分配的资源返还给系统。所以异常可能发生时,要须对每一异常分别进行处理。
异常处理抓抛方法有两大优点:
(1):异常情况能在有必要之处加以处理,而不在其发生处和需要进行处理处之间的每一级上均进行处理;
(2):能够编写统一的、可重用的异常处理代码。
异常处理流也是程序中的控制流。当异常发生时,抛出一个异常。异常伴随调用链,直到它们被捕获或程序退出为止。
try{
//放置可能出现异常的代码
}catch(Exception1 el){
//如果 try 块抛出异常对象的类型为 Exceptionl,那么就在这里进行处理
}catch(Exception2 e2){
//如果 try 块抛出异常对象的类型为 Exception2,那么就在这里进行处理
}catch(ExceptionN eN){
//如果 try 块抛出异常对象的类型为 ExceptionN,那么就在这里进行处理
}finally{
//不管是否有异常发生,始终执行这个代码块
}
1.2 异常代码
1.2.1:try.catch.finally
- try
在try 语句块中包含可能会产生异常的语句。try 块后可随一个或多个 catch 块,用来捕获在 try 中抛出的异常。另一方面,try 不可以跟随在 catch 块之后。
- catch 块
catch 用来捕获并处理 try 中抛出的异常的代码块。没有 try 块,catch 块不能单独存在,我们可有多个 catch 块,以捕获不同类型的异常。 多个catch 块时,从上往下 catch 异常的范围应该从小到大,因为
catch块的运行机制是找到一个匹配的就进行处理了,如果把范围大的放在前面,那么后面的代码就没有机会运行了.
- finally 块
finally 块表示:是可选的,无论是否出现异常,都会运行的块
通常在 finally 块中可以编写资源返还给系统的语句,通常,这些语句包括但不限于:
(1):释放动态分配的内存块:
(2):关闭文件;
(3):关闭数据库结果集;
(4):关闭与数据库建立的连接;
//e1的范围要小于e2
try{
}catch(异常类型 1 e1){
}catch(异常类型 2 e2){
}finally{
}
- try、catch、finally 块的关系
(1):try 块不能单独存在,后面必须跟 catch 块或者 finally 块
(2):三者之间的组合为:try—catch 、try—catch—finally 、 try—finally 这几种是合法的(3):一个 try 块可以有多个 catch 块,从上到下多个 catch 块的范围为从小到大
- return之后也可以执行finally
try{
return "aa";
}finally{
System.out.println("last finally");
}
1.2.2 throw.throws 语句
- throw 语句用来从代码中主动抛出异常。throw 的操作数是任一种异常类对象。
try {
int i = 5/0;
} catch (ArithmeticException i) {
throw new Exception("Can not be divided by zero!");
}
- throws 语句
throws 用来在方法定义时声明异常。
Java 中对异常的处理有两种方法,一个就是 try-catch,然后自己处理;一个就是不做处理,向外 throws,由别人去处理。
1.3:调用栈机制
异常如果不try/catch,则会上抛直到处理,如果一直不处理会到 main(),如main()不处理,则该异常就异常地中断程序。
1.4:异常的分类
java.lang.Throwable 类充当所有对象的父类。在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有 Error 和 Exception 两个基本子类。
-
- 错误(Error):JVM 系统内部错误、资源耗尽等严重情况;
-
- 异常(Exception ):其它因编程错误或偶然的外在因素导致的一般性问题。
Error发生 时,程序员根本无能为力,只能让程序终止。比如说内存溢出,不可能指望程序能处理这样的情况。而对于 Exception,而有补救或控制的可能,程序员也可以预先防。
1.5 异常继承层次
为有效地描述异常状况、传递有关的异常信息,JDK中针对各种异常情况定义了多种异常类型:
RuntimeException(运行时异常)是指因设计或实现方式不当导致的问题程序员的原因导致的,本来可以避免发生的情况。比如ArrayIndexOutOfBoundsException和NullPointerException提前判断都可以避免.
IOException 在内的其它违例,则可以认为是描述运行时遇到的困难,它通常由环境而并非程序员的原因引起,可以进行处理。例如:文件未找到或无效 URL 异常都经常容易出现。
Java 程序异常处理的原则为:
(1)对于 Error 和 RuntimeException,可以在程序中进行捕获和处理,但不是必须的;
(2)对于 IOException 及其它异常,必须在程序中进行捕获和处理。
1.7:自定义异常
预定义异常:Java 编程语言中预先定义好的异常叫预定义异常.
自定义异常:Java允许用户创建自己的异常类型,用于表述非预定义异常,这些类型也必须继承Throwable类或其子类。用户自定义异常类通常属 Exception 范畴,依据命名惯例,应以 Exception 结尾。用户自定义异常未被加入 JRE 的控制逻辑中,因此永远不会自动抛出,只能由人工创建并抛出。
2:断言
2.1 断言概述
断言用于证明和测试程序的假设,比如“这里的值大于 5”。
断言可以在运行时从代码中完全删除,所以对代码的运行速度没有影响。
断言有两种方法:一种是 assert<<布尔表达式>>;另一种是 assert<<布尔表达式>>:<<细节描述>>。
如果布尔表达式的值为 false,将抛出 AssertionError 异常;细节描述是 AssertionError断言使用 boolean 值,如果其值不为 true 则抛出 AssertionError 并终止程序的运行。
断言推荐使用方法
用于验证方法中的内部逻辑,包括:-内在不变式
-控制流程不变式
-后置条件和类不变式
注意:不推荐用于公有方法内的前置条件的检查
运行时要允许/屏蔽断言
运行时要屏蔽断言,可以用如下方法:
java –disableassertions 或 java –da
运行时要允许断言,可以用如下方法:
java –enableassertions 或 java –ea
注:文中内容来自网络文字总结.