[TOC]
![](https://img.kancloud.cn/69/6e/696ec4511a5cc67a919ee0db4b99f9ab_647x399.png)
## Throwable
* Java 语言中所有错误或异常的超类。
* Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。
* 它还可以包含 cause(原因)
## Error
* Error 是 Throwable 的子类,用于指示合理的应用程序**不应该试图捕获的严重问题**。
* 大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
* 在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。
* Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
## Exception
Exception 异常主要分为两类
1. RuntimeException(运行时异常),RuntimeException 被称作「非受查异常」。
2. 其他Exception,称作「受查异常」
受查异常就是指,编译器在编译期间要求必须得到处理的那些异常,你必须在编译期处理了。
## 自定义异常类型
Java 的异常机制中所定义的所有异常不可能预见所有可能出现的错误,某些特定的情境下,则需要我们自定义异常类型来向上报告某些错误信息。
在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
* 所有异常都必须是 Throwable 的子类。
* 如果希望写一个检查性异常类,则需要继承 Exception 类。
* 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
## 异常的处理方式
### try...catch关键字
* 使用 try 和 catch 关键字可以捕获异常。
* try/catch 代码块放在异常可能发生的地方。
### try catch不会影响性能
* 异常如果没发生,也就不会去查表,也就是说你写不写try catch 也就是有没有这 个异常表的问题,如果没有发生异常,写try catch对性能是木有消耗的,所以不会让程序跑得更慢。
* try 的范围大小其实就是异常表中两个值(开始地址和结束地址)的差异而已,也是不会影响性能的。
### throws/throw 关键字
如果一个方法**没有捕获一个检查性异常**,那么该方法**必须使用 throws 关键字来声明**。throws 关键字放在方法签名的尾部。**也可以使用 throw 关键字抛出一个异常**,无论它是新实例化的还是刚捕获到的。
### finally关键字
注意,凡是有finally,那么一定会执行里面的代码,并且根据里面的return
## 推荐阅读
[java-异常体系](https://www.jianshu.com/p/49d2c3975c56)
- Java
- Object
- 内部类
- 异常
- 注解
- 反射
- 静态代理与动态代理
- 泛型
- 继承
- JVM
- ClassLoader
- String
- 数据结构
- Java集合类
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并发集合类
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合类
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉树遍历
- 剑指
- 数据结构、算法和数据操作
- 高质量的代码
- 解决问题的思路
- 优化时间和空间效率
- 面试中的各项能力
- 算法心得
- 并发
- Thread
- 锁
- java内存模型
- CAS
- 原子类Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子类
- 锁小结
- 堵塞队列
- 生产者消费者模型
- 线程池