异常
分类
-
检查性异常、运行时异常、错误ERROR:
-
检查性异常:
用户错误或问题引起的异常,程序员无法预见;
在编译时不能被忽略;
例如:打开一个不存在的文件
-
运行时异常:
可被程序员预见,并避免;
在编译时可被忽略;
-
错误ERROR:
不是异常,是脱离程序员控制的问题;
在编译时也检查不到;
例如:栈溢出
-
-
Error 和 Exception:
-
Error:无法预见;
-
Exception:可以预见;
-
-
异常处理框架
Error
-
对象由 Java虚拟机 生成 并 抛出;
-
与程序员无关;
-
OutOfMemoryError 发生时,JVM 会选择线程终止;
-
JVM试图执行应用时,类定义错误(NoClassDefFoundError)、链接错误(LinkageError),这些错误不可查,因为它们在应用程序的控制和处理能力之外。
-
致命性,程序无法控制和处理,JVM终止线程;
Exception
-
运行时异常(不可预见) 与 非运行时异常(可预见)
-
检查性异常(可预见) 与 非检查性异常(不可预见)
-
可被程序处理,且应尽可能处理;
关键字
-
try、catch、finally、throw、throws
-
finally:释放资源
-
运行时异常不需要程序员主动抛出异常,JVM会自动抛出异常,但若不用 “try catch” 捕获,则程序遇到这个异常会停止运行,用 “try catch” 捕获,程序不会停止,会依旧正常继续往下执行。
自定义异常
经验总结
-
运行时异常:合理规避 + “try catch”处理;
-
多重catch块:catch(Exception)处理可能被遗漏的异常;
-
不确定代码:“try catch” 处理潜在异常;
-
尽量处理异常,比如补偿机制、重试机制,切忌简单调用printStackTrace()打印输出;