目录
NPE指空指针异常(NullPointerException),
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
异常体系整理
什么是异常处理
- 异常是被调用方向调用方传递错误信息的一种途径, 当被调用方的方法在执行过程中出现了问题, 可以通过抛出异常对象, 让调用方捕捉从而实现错误信息的传递。
- 使用异常机制可以保证程序代码更加优雅,并提高程序健壮性。
- 被调用方抛出的异常对象能清晰的向调用方反应what, where, why这3个问题:
异常类型反应了“什么”被抛出
异常堆栈跟踪反应了“在哪”抛出
异常信息反应了“为什么”会抛出
Java异常体系类图
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 |
什么是NPE, 为什么会发生NPE
NPE指空指针异常(NullPointerException),
本身引用的内容是空的,比如获取一个对象的值,但是这个对象在逻辑中没拿到值,变成了null
什么是OOM, 为什么会发生OOM
OOM指内存溢出(OutOfMemoryError),
自身原因: 比如虚拟机本身可使用的内存太少。外在原因: 如应用使用的太多, 且用完没释放, 浪费了内存。此时就会造成内存泄露或者内存溢出。
throw和throws的区别
Throw:
- 作用在方法内,表示抛出具体异常,由方法体内的语句处理。
- 具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。
Throws:
- 作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。
- 主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。
- 出现异常是一种可能性,但不一定会发生异常。
throw和return的区别
return 的作用是方法返回,并且可以根据返回值类型返回相应的变量
throw 的作用也是方法返回,但是只能返回异常对象,也就是说throw后面跟的对象必须是Throwable的子类创建的.
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中改变了返回的变量的值, 也不会对最终返回值产生影响。