Java中异常知识点总结
文章目录
前言
Java中的异常是我们在编写项目中不可避免的一环,也是找工作面试常问的知识点。以下记录学习异常时,要注意的几个知识点!
一、异常的基础知识
-
异常是指在程序中导致程序中断运行的一种指令流
-
异常的产生是通过创建异常对象实现的。当程序执行到某条指令发生错误时,JVM会让发生错误的代码部分变成生成一个对应类型的异常对象的操作,若当前程序中没有处理该异常的代码,该异常信息返回给调用它的方法,即又返还给了JVM,JVM就会中断程序,并抛出这个异常;
-
在程序中处理异常的语句的功能叫做异常的捕获。通过下面所示的代码进行处理:
try{ 语句; }catch(异常类型){ 处理异常的逻辑; }finally{ 不管是否有异常都会执行的语句; }
-
错误error。即JVM在执行程序的时候发现的认为程序员没有办法通过代码来处理的问题,就报error。
-
异常分为受检异常和非受检异常,即编译时异常和运行时异常
-
增加捕获异常代码后,执行程序时若执行到出问题的程序会立马跳到catch里,处理该异常,而不会执行异常代码的下面的程序。
-
对于未加异常处理的代码,出现异常时,JVM会抛出异常并立即在出现问题的指令行中断程序;加了捕获异常的代码后,程序出现异常后,会被catch捕获并处理,不影响后面程序的执行。
二、三个重要知识点
1.关于finally中代码的执行问题
1> finally里面的程序一定会被执行,即使在try里面已经return了,但由于该结构的存在,finally里面的程序会在try中的return之前执行掉,所以若try中最终返回的值(该值为引用类型),在finally中做了更改,那么返回的是更改之后的值。这个可以用debug跟踪看到程序的执行顺序。
2>上面所说的执行完finally中的程序会改变try中返回值的情况,只针对该数据类型为引用数据类型。因为,在该结构中,return这一步是将变量的地址进行备份,一会儿用于返回;在真正返回之前,原变量去finally中执行最后的程序,然后再返回之前备份好的变量。而对于引用数据类型,因为备份的是地址,所以改变值之后会同步到内存块;而对于基本数据类型,备份的是变量的值,再操作原变量进行改值,备份的那个变量的值是不会变的。
2.会导致finally中程序不执行的情况
1>在代码中唯一导致finally里面的程序不执行的代码就是System.exit();在异常捕获后,直接执行该语句会退出虚拟机,finally中的代码自然不会执行.
try{
语句;
return 变量1;
}catch(异常类型){
System.exit();
}finally{
变量1++;
}
如上图中代码,在catch中使用System.exit();代码退出虚拟机,即在捕获到异常后就退出程序,这样finally的语句是无法执行的。
2>其余情况就是软件被关闭或者电脑关机或者突然停电,否则finally的程序一定会被执行。
3.throws与throw的区别
1>throws即在编写程序时,对于会出现异常的代码,不做异常捕获,而是直接在方法申明处使用throws抛出异常,让调用程序去处理;
2>而throw是对于可能错的代码,创建一个异常对象,然后将其用throw抛出,即throw是用来产生异常的。即该异常是我们程序员创建的,通过抛异常的形式对程序使用者做警告,和格局条件输出提示语句是一个意思,不过通过创建异常的方式会直接中断程序。
补充:异常的自定义,可分为2类,即通过继承运行时异常和非运行时异常来定义自己的异常。注意定义的非运行时异常必须扔出去而不能捕获,因为没有意义。
总结
异常这里需要特别注意的就是,try中出现如下语句时:
try{
语句;
return 变量1;
}catch(异常类型){
处理异常的逻辑;
}finally{
变量1++;
}
要分辨变量1是引用类型变量还是基本数据类型变量,他们的情况会造成最终返回值的不同。