一.使用try-catch捕获单个异常
如果异常出现的话,会立即终止程序,我们得处理异常:
1) :该方法不处理,而是声明抛出,由该方法的调用者来处理,(throws)
2) :在方法中使用try-catch的语句块来处理异常-
使用try-catch捕获单个异常:
语法如下:
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印日常信息,继续抛出异常
}
注意:catch 和try都不能单独使用
二.获取和查看异常信息
1) :String getMessage(): 获取异常的描述信息,原因
2) String toString():获取异常的类型和异常描述的信息(一般不用)
3) :void printStackTrace():打印异常的跟踪栈信息并输出到控制台.不需要使用System
包含了异常的类型.异常的原因,还包括了异常出现的位置,在开发调试阶段,都得使用printStackTrace
现在在catch语句块中,必须写: e.printStackTrace(); 目的:查看异常的具体信息,方便调试和修改.
三.使用try-catch捕获多个异常
try{
编写可能会出现异常的代码
}catch(异常类型A e){当try中出现A类型异常,就用该catch来捕获
处理异常的代码1
//记录日志/打印日常信息,继续抛出异常
}catch(异常类型B e){当try中出现B类型异常,就用该catch来捕获
处理异常的代码2
//记录日志/打印日常信息,继续抛出异常
}
注意:代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能同时出现多个异常.
Exception放在最后
四.保证关闭资源的finally代码块
finally语句块表示最终都会执行的代码, 无论有没有异常.
什么时候的代码必须最终执行
当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等).我们都得在使用完之后,最终关闭打开的资源,
finally的语法
1) : try........finally: 此时没有catch来捕获异常, 因为此时根据应用场景,我们会抛出异常, 自己不处理
2) : try.....catch .........finally: 自身需要处理异常, 最终还得关闭资源.
注意:finally不能单独使用.
当只有在try或catch中调用退出jvm的相关方法, 此时finally才不会执行,
否则finally永远会执行
System.exit(0)://退出jvm
--------------------------------------------------------------------------------------------
必须使用finally才能保证最终必须执行的代码
如果finally有return语句,永远返回finally中的结果,避免该情况,
六.异常的分类
1) : 编译时期异常,checked异常.在编译时期,就会检查,如果没有处理异常,则编译失败
2) : 运行时期异常,runtime异常,在运行时期, 检查异常,在编译时期, 运行异常不会编译器检测(不报错)
运行异常: 在编译时期, 可处理,可不处理.
如何确定某一个类是编译异常还是运行异常
返回错误结果-throw语句
抛出异常:
throw:运用于方法内部,用于给调用者返回一个异常对象,和returm一样,会结束当前方法
throws: 运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(
(抛出异常)
//表示: 在本方法中不处理某种类型的异常, 提醒调用者需要来处理异常
如:private static int divide(int num1,int num2) throws Exception
如果每一个方法都放弃处理异常,都直接通过throws声明抛出,最后异常会抛到main方法.
如果此时mian方法不处理,继续抛出给jvm,底层的处理机制就是打印异常的跟踪栈信息
runtime异常,默认就是这种处理方式.
throw语句:
运用于方法内部,抛出一个具体的异常对象,
throw new 异常类(“异常信息”);终止方法.
throw:
一般的,当一个方法出现不正常的情况的时候,我们不知道该方法应该返回什么,此时就返回一个错误,
在catch语句块中继续向上抛出异常
return是返回一个值,throw是返回一个错误, 返回给该方法的调用者
微观上分析和理解框架各个模块的设计细节
宏观上分析和把控框架整体的设计思想