异常与断言
1 异常
在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。
在Java中,把各种异常现象进行了抽象形成了异常类。
1.1 异常的分类
异常主要分为:错误、一般性异常(受控异常)、运行时异常(非受控异常)
-
错误:如果应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,最典型的Error的异常是:OutOfMemoryError
-
受控异常:这种异常属于一般性异常,出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过。编译器强制普通异常必须try…catch处理,或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常
-
非受控异常:非受控异常也即是运行时异常(RuntimeException),这种系统异常可以处理也可以不处理
1.2 异常的处理
运行时异常(系统异常)不需要预处理,通过规范的代码可以避免产生这种异常
受检异常(编译时异常)必须预处理,否则编译报错,有两种预处理方式 :
-
捕获处理
-
抛出处理
1.3 try、catch
异常的捕获和处理需要采用try
和catch
来处理,具体格式如下:
try {
} catch (OneException e) {
} catch (TwoException e) {
} finally {
}
- try中包含了可能产生异常的代码
- try后面是catch,catch可以有一个或多个,catch中是需要捕获的异常
- 当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch中
finally表示,不管是出现异常,还是没有出现异常,finally里的代码都执行,finally和catch可以分开使用,但finally必须和try一块使用
1.3.1 异常的捕获顺序
异常的捕获:一般按照由小到大的顺序,也就是先截获子异常,再截获父异常
1.4 throws抛出处理
在定义方法时,如果方法体中有受检(编译时)异常需要预处理,可以捕获处理,也可以抛出处理。
处理异常时,使用throws抛出处理:
- 谁调用这个方法,谁负责处理该异常
- 在定义方法时,把异常抛出就是为了提醒方法的使用者,有异常需要预处理
- 在处理异常时,是选择捕获处理还是抛出处理
一般情况下,在调用其他方法时,如果被调用的方法有受检(编译时)异常需要预处理,选择捕获处理,因为你调用了方法, 你负责处理该异常。
在定义方法时,如果方法体中有受检异常需要预处理,可以选择捕获 ,也可以选择抛出处理。如果方法体中通过throw语句抛出了一个异常对象,所在的方法应该使用throws声明该异常。
1.5 throw 和 throws 的区别
1. throw
throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throw一般用于抛出自定义异常。
2. throws
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
throws表示出现异常的一种可能性,并不一定会发生这种异常。
2 断言
主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。
- 语法1:assert expression; //expression代表一个布尔类型的表达式,如果为真,就继续正常运行,如果为假,程序退出
- 语法2:assert expression1 : expression2; //expression1是一个布尔表达式,expression2是一个基本类型或者Object类型,如果expression1为真,则程序忽略expression2继续运行;如果expression1为假,则运行expression2,然后退出程序。
public class AssertionDemo {
//这个成员变量的值可以变,但最终必须还是回到原值5
static int i = 5;
public static void main(String[] args) {
assert i==6;
System.out.println("如果断言正常,我就被打印");
}
}
public class AssertionDemo {
public static void main(String[] args) {
int i = 3;
switch (i) {
case 1:
System.out.println("正常");
break;
case 2:
System.out.println("正常");
break;
case 5:
System.out.println("正常");
break;
default:
assert false:"i的值无效"; //如果i的值不是你想要的,程序就警告退出
}
System.out.println("如果断言正常,我就被打印");
}
}