异常处理
一、Try Catch
1、异常是在程序中导致程序中断运行的一种指令流。
分类:
1、受检查异常:编写时标红
2、非受检查异常:运行时出现异常。
格式:
try{// 有可能发生异常的代码段
}catch(异常类型1 对象名1){ // 异常的处理操作
}catch(异常类型2 对象名2){
try+catch的处理流程
finally 异常体系结构 // 异常的处理操作 }
... finally{ // 异常的统一出口 }
finally:是程序必然执行的语句块。
3、处理流程
1、 一旦产生异常,则系统会自动产生一个异常类的实例化对象。
2、 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异常抛出.
3、 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理
4、异常体系结构
异常指的是Exception , Exception类, 在Java中存在一个父类Throwable(可能的抛出) Throwable存在两个子类:
1.Error:表示的是错误,是JVM发出的错误操作,只能尽量避免,无法用代码处理。
2.Exception:一般表示所有程序中的错误,所以一般在程序中将进行try…catch的处理。
********面试题:****finally在某种情况下是否会被执行?
答:除非执行到finally语句之前程序被关闭,例如电脑关机、停电,这种情况下不会被执行。
例如:下面两段代码的输出是什么?
(1)
答:第一段应输出:10,第二段应输出28。
图解如下:
第一段代码中基本数据类型是在栈中存放,所以备份的是最先存入的10,当执行finally时会将10改为20,但是我们备份的数据是10.所以输出的是10.第二段代码的引用数据数据需要在堆中开辟一段空间,然后将一段地址传给栈中的对象名称,备份的是堆传过来的地址,我们修改的是堆中的数据,所以返回的是28.。
**3)finally语句块会执行吗?
答:不执行。catch中的System.exit(0)是唯一一种会导致finally不执行的代码。
**
二、throws
此关键字主要在方法的声明上使 用,表示方法中不处理异常,而交给调用处处理。
异常是否抛出去:如果是因为用户传参导致程序出错,应采用throws关键字将异常跑出去。
面试题:1. try-catch-finally 中哪个部分可以省略?**
答: catch和finally可以省略其中一个 , catch和finally不能同时省略 .
注意:格式上允许省略catch块, 但是发生异常时就不会捕获异常了,我们在开发中也不会这样去写代码.