目录
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
一、异常体系
异常是一个对象
Java把异常也封装成为了对象
异常体系图:
关键字throw和throws
1.throw的作用与return很像
return的作用是方法返回,并且可以根据返回值类型返回相应的的变量
throw的作用也是方法返回,但是只能返回异常对象,也就是说throw后面跟的对象必须是Throwable的子类创建的
调用方的代码处于上层,被调用方的代码处于下层
上层代码调用下层代码的时候
下层可以同时有正常返回和异常返回两种返回方式
下层可以没有任何返回
下层可以只有正常返回
下层也可以只有异常返回
下层方法中正常返回用return
下层方法中异常返回(抛出)用throw
上层接收下层正常返回的结果的语法是:
数据类型 变量 = 方法();
1.变量用于接收下层方法的返回值,它的数据类型必须与下层方法中的返回值类型一样或者兼容
2.上层接收下层异常抛出的对象的语法是:
逐级往上抛异常:
解决方式
或
异常对象中有什么?
1.异常信息
下层代码构造异常对象的时候,可以在构造方法中传入一个String类型的异常信息,这个异常信息会存储在Throwable中的detailMessage成员变量中,上层代码在捕捉到异常对象后可以使用getMessage()读取到下层返回的异常信息
2.异常发源地的追踪信息
当下层代码构造异常对象的时候,会创建一个栈,存储本次代码执行过程中所涉及到的所有的方法信息,这些信息包括1.方法入栈执行的先后顺序;2.出异常的代码在哪个类中的哪一行
err打印出来红色的
Exception和Error的区别
Exception和Error同属于Throwable的直接子类, 是2个体系
Exception 体系的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。
Error体系的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测, 我们也不需要对这类错误进行捕获处理(因为你捕捉了也没用), 一旦这类错误发生, 应用程序会被终止。
Exception和RuntimeException的区别
RuntimeException是Exception的子类
Exception是受检的, 称为编译时异常
RuntimeException是不受检的, 称为运行时异常
PS: 这题的问法也可能是 "受检异常和不受检异常的区别是什么"
答: 受检异常指的是在编译时接受编译器的检查, 如果没有处理异常则不能通过编译, Exception类及其子类都属于受检异常, RuntimeException类
常见的异常有哪些
受检: 接受编译器的检查
Error错误(不受检) | Exception 编译时异常 (受检) | RuntimeException运行时异常 (不受检) |
内存溢出 OutOfMemoryError | 数据库异常 SQLException | 空指针异常 NullPointerException |
栈溢出 StackOverflowError | 类找不到异常 ClassNotFoundException | 类型转换异常 ClassCastException |
IO流异常 IOException | 算术异常 ArithmeticException | |
文件找不到异常 FileNotFoundException | 索引越界异常 IndexOutOfBoundsException | |
输入不匹配异常 InputMismatchException | ||
数字转换异常 NumberFormatException |
try-catch-finally语法中那一部分可以省略
try不可以省略
catch可以省略
finally可以省略
catch和finally不可以同时省略
try-catch: try中发生的异常被catch捕捉, 程序可以继续往后运行
try-finally: try中发生的异常没有被程序捕捉, 程序会立即退出, 但退出之前会执行finally
try-catch-finally: try中发生异常, 异常代码后面的代码不会执行, 直接进入catch, try中没有发生异常, 不会进入catch, 无论是否发生异常, finally都会执行
一般会在finally块中做什么
在try-catch-finally语法中, 无论执行try还是catch, 最终都会执行finally, 所有我们一般把在try中打开的资源放在finally中进行释放
例如: 在try中创建了数据库连接, 在finally中关闭
在try中创建的IO流, 在finally中关闭
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
finally会在return之前执行, 但是finally中无法改变返回值的结果
可以理解为执行return的时候, 先确定下了返回值, 但方法还没有出栈, 然后执行finally, 如果finally中改变了返回的变量的值, 也不会对最终返回值产生影响。
二、关键字整理
.
.final 修饰符 - 最终的
修饰变量,称为常量,值不可以修改
修饰方法,称为最终方法,方法不可以被子类重写
修饰类,称为最终类,类不可以被继承
abstract关键字是否可以与final同时出现或者能不能同时用abstract和final修饰类或者方法?
答案是不能,原因是
1.abstract修饰的类称为抽象类,抽象类不能被实例化,只能被继承,而final是阻止类被继承
2.abstract修饰的方法称为抽象方法,抽象方法必须让子类重写,而final是阻止子类重写
final修饰的变量真的不能改变吗?
如果final修饰的变量是基本数据类型,指向常量池,那么值不可以被修改
如果final修饰的变量是引用数据类型,指向堆,那么指针不可以修改,但是指针指向的对象内的成员可以修改