最近打算跳槽,读了一下极客时间的java核心技术36讲,感觉还不错,就此做个笔记(感兴趣的也可以点击购买链接http://stuq.com/a/100nJ,非广告推广)。本文所有内容,摘自https://time.geekbang.org/column/article/6849笔记,侵删
引言
Exception 和 Error 都是继承了Throwable类,在java中只有Throwable的实例才能被抛出或者捕获。
Error不能恢复java程序也不应该被捕获。
Exception分为可检查和不可检查的类型,可检查的异常应该在编码期间显式捕获,因为虚拟机会在编译期进行检查。不检查异常是指类似 NullPointerException、ArrayIndexOutOfBoundsException
深入理解异常
Error和Exception都继承于Throwable。
ClassNotFoundException和NoClassDefFoundError的区别??
首先NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,ClassNotFoundException的产生原因:
Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。
NoClassDefFoundError产生的原因:
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError.
处理异常
1.不要捕获通用异常,而是要捕获特定异常
2.不要不要生吞异常
3.Throw early, catch late,尽早在能避免异常的时候抛出异常,然后再处理异常
4.自定义异常的时候,考虑是否要定义成可检查异常,因为这种异常是考虑到可以从异常中恢复制定的。另外自定义异常的时候考虑尽量不要包含敏感信息
5.java的异常处理机制中try-catch 阶段会产生额外的开销,影响JVM对代码的优化,不要用异常处理。另外每生成一个异常,jvm都会对当前栈进行快照,(个人理解是:栈快照是栈内操作的集合,用来记录栈操作的)
- 一个函数尽管抛出了多个异常,但是只有一个异常可被传播到调用端。最后被抛出的异常时唯一被调用端接收的异常,其他异常都会被吞没掩盖。如果调用端要知道造成失败的最初原因,程序之中就绝不能掩盖任何异常。
7.当遇到return语句的时候,执行函数会立刻返回。但是,在Java语言中,如果存在finally就会有例外。除了return语句,try代码块中的break或continue语句也可能使控制权进入finally代码块。