前言
一、避免异常的两种方式
1.LBYL
2.EAFP
二、异常的基本用法
1.异常的基本语法
2.使用try...catch...finally注意事项
三、异常的体系结构
1.顶层类Throwable
1.顶层类Throwable 派生出两个重要的子类Error和Exception
2.非受查异常与受查异常
2.自定义类
总结
前言
首先,对于异常来说是程序运行时抛出的错误,编译出错,不属于此处的异常。
一、避免异常的两种方式
1.LBYL
LBYL : Look Before You Leap. 在操作之前做好充分的检查
代码风格如下:
//这里登录游戏伪代码展示
boolean ret = false;
ret = 登录游戏();
if(!ret){
登录游戏错误处理;
return;
}
ret = 开始匹配();
if(!ret){
处理匹配错误;
return;
}
.......
2.EAFP
EAFP :It's Easier to Ask Forgiveness than Permission. " 事后获取原谅比事前获得许可更容易"
代码风格如下:
try{
登录游戏();
开始匹配();
}catch (登录游戏异常){
异常处理
}catch (开始匹配异常){
异常处理
}
......
对比上述的两种代码的风格,可以看出采用EAFP的方法显得代码更加的清晰简洁,更容易理解。
二、异常的基本用法
1.异常的基本语法
try{
// 里面存放可能出现异常的代码
}catch(捕获相应的异常){ //此处的catch可以有[0,N]个
// 出现异常后的处理方式
}finally{
//不是强制要求写的
//无论是否发生异常,都会执行的代码块
//关闭资源的处理
}
2.使用try...catch...finally注意事项
1.异常的基本语法
try{
// 里面存放可能出现异常的代码
}catch(捕获相应的异常){ //此处的catch可以有[0,N]个
// 出现异常后的处理方式
}finally{
//不是强制要求写的
//无论是否发生异常,都会执行的代码块
//关闭资源的处理
}
2.使用try...catch...finally注意事项
try{
// 里面存放可能出现异常的代码
}catch(捕获相应的异常){ //此处的catch可以有[0,N]个
// 出现异常后的处理方式
}finally{
//不是强制要求写的
//无论是否发生异常,都会执行的代码块
//关闭资源的处理
}
1.如果catch后面跟的异常与try代码块中发生的异常类型不匹配--->就无法捕获发生的异常。
所以可以有多个catch来捕获不同的异常类型。
2.在try代码块中出现异常,并且被catch捕获,则不会影响代码块之后的代码执行。
3.如果try代码块中出现异常,那么try代码块中的后面的程序就不会执行了,而是交给catch代码块
执行,catch执行完毕,会继续的往下执行。
4.finally代码块,无论是否发生异常都会执行的代码块----通常做善后处理(资源的关闭等)。
5一旦finally中带入了返回值,则catch和try代码块中的返回值就失效了---会执行finally中的返回
值。所以一般的情况下,尽量不需要在finally代码块中带入返回值;
实例代码如下:
public class Test {
public int add(){
try{
int a = 0;
if(a == 0){
return 0;
}
int b = 1/a;
}catch (ArithmeticException e){
return 1;
}
finally {
return 3;
}
}
public static void main(String[] args) {
System.out.println(new Test().add());
}
}
这里演示的是try代码块中的返回值失效,走到 return 0 时,就会执行finally中的代码块,然后最后返回了 3。
6.关于异常的调用链 :异常会随着调用链不断的向上传递,直到有一处捕获异常为止。如果处理的过程中都没有处理异常,最终会将异常抛给JVM,然后程序就终止了。
7.JDK7新增的自动关闭接口 : 声明在try的()中
代码演示如下:
public class Test {
public static void main(String[] args) {
//此处就可以保证在try执行完毕后,自动的调用Scanner 的 close 方法
try(Scanner scanner = new Scanner(System.in)){
int num = scanner.nextInt();
System.out.println(num);
}catch (Exception e){
e.printStackTrace();
}
}
}
8.一组关键字:throws : 用在方法的声明上,明确的表示该方法可能会有异常,但是不处理,抛回给调用者处理。 throw : 用在方法的内部,人为的产生异常的对象抛出。
throws 的代码演示:
public class Test {
public static void main(String[] args) {
try{
test();
}catch (NullPointerException e){
System.out.println("我是他的调用者,我处理了异常");
e.printStackTrace();
}
}
public static void test() throws NullPointerException{
String str = null;
System.out.println(str.equals("hello"));
}
}
throw代码演示:
public class Test {
public static void main(String[] args) {
test();
}
public static void test() throws NullPointerException{
throw new NullPointerException("没事抛出个空指针异常,就是玩~~");
}
}
三、异常的体系结构
1.顶层类Throwable
1.顶层类Throwable 派生出两个重要的子类Error和Exception
1.顶层类Throwable 派生出两个重要的子类Error和Exception
Error : 是指java运行时内部错误和资源耗尽的情况; 例如StackOverflowError(栈溢出)、OutOfMemoryError(堆溢出)
Exception : 就是我们程序员所使用异常类的父类
2.非受查异常与受查异常
非受查异常 :不强制使用try...catch代码块处理的异常 。Error以及RuntimeException及其子类(数组越界异常、空指针异常、类型转换异常)都是非受查异常。
受查异常 : 必须显示的使用try...catch代码块来捕获异常,或者使用throws抛出。例如FileNotFoundException异常。
2.自定义类
1.自定义类通常会继承自 Exception 或者 RuntimeException。
2.继承自Exception的异常默认是受查异常
3.继承自RuntimeException的异常默认是非受查异常。
总结
继续的加油啊,小老弟~~~



