java处理异常的两种机制
一:捕获异常(主动)
通常由try和catch来完成
二:声明抛出异常(被动)
通常由throw和throws来完成
有关try和catch:
1.功能
①try代码块:包含可能一个或多个异常的代码;
②catch代码块:用于处理try代码块抛出的具体异常类型的异常对象
(注意!是具体的)
2.用法
①常用语法格式如下:
try{
}//可能发生异常的代码
catch(Throwable e){
}//对异常处理的代码段
②多重catch处理异常:
try{
}//可能发生异常的代码
catch(异常类型1 e){
}//对异常处理的代码段
catch(异常类型2 e){
}//对异常处理的代码段
catch(异常类型3 e){
}//对异常处理的代码段
★注意:多次使用catch语句时,catch语句的顺序非常重要!
首先应该捕获最特殊的异常,再逐渐一般化
即:先catch子类,再catch父类
③try和catch语句的嵌套使用(嵌套异常处理)
try{
try{
}//内部
catch(异常类型1 ex){
}//内部
}
catch(异常类型2 ex){
}//外部
★注意:
在使用嵌套try时 程序先执行内部try块
如果没有遇到匹配的catch块 再检查外部try块的catch块
3:有关"finally"关键字
①使用情景:
在某些特定情况下,不管有没有异常发生,总需要有一些代码必须要被执行
(例如:进行数据库连接时,无论对数据库操作有没有成功,最后都要关闭关闭数据库的连接并释放内存资源)
此时就要利用finally关键字
②用法:
try{
//可能发生异常的代码
}
catch(异常类型 ex){
//对异常处理的代码段
}
finally{
//总要被执行的代码
}
★注意:finally不能单独使用,必须和try结合使用!
使用方法通常有两种:
try-finally;
try-catch-finally
有关throw和throws:
1:throw语句(编写在方法之中★)
①使用背景
throw语句用来抛出一个“明确的”异常 (已经知道发生异常的具体类型)
需要注意:用户必须得到Throwable类或其他子类产生的对象引用,通过参数传到catch语句,或者用new语句来创建一个异常对象。
②语句通常使用形式:
throw + (异常对象)
2:throws语句(编写在方法签名之后★)
①使用背景
如果一个方法可以引发异常,而他本身不对这个异常进行处理 (当后面调用这个方法时再使用try和catch去处理),那么这个方法必须声明将这个异常抛出。
②语句使用格式:
MethodName()throws ExceptionType1, ExceptionType2
③注意事项
在同一个方法中使用throw和throws时,throws抛出的异常类型比throw抛出的异常类型范围要大或者相同。
★throws关键字用法举例:
public class testThrows(){
public static void function() throws NumberFormatException {
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能强制类型转换。");
//e.printStackTrace();
}
}
此段代码有一个主方法和一个function方法;
首先
我们在编写function()时,预料它可能产生NumberFormatException这个异常,但是我们并不想在这个方法中处理异常,就在方法名后使用关键字throws,将异常抛出。
后来
我们需要在主方法中调用function(),此时我们就要使用try和catch语句块来处理刚才预料到的异常。
必须注意的是——“catch语句中的异常类型和throws后面的异常类型要相同”
3:throw和throws的区别(重点)
① throw用在方法中,throws用在方法声明中。
② throw只能用于抛出一种异常,而throws可以抛出多个异常。
③ throw则是抛出了异常,执行throw则一定抛出了某种异常; throws表示出现异常的一种可能性,并不一定会发生这些异常。
来个小总结
try和catch是主动去处理发生的异常(积极)
throw和throws两者都是被动处理异常的方式(消极),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
//此篇文章是我这个初学小菜鸟的个人拙见,个别知识点理解可能有偏差,欢迎大家批评指正。 另外这是我在CSDN写的第一篇文章,也算是个开始~以后要在这里记录自己成长的点点滴滴,奥利给!