1. 发生异常的原因
- 不可控的内部原因,比如内存不够了、磁盘满了
- 不可控的外部原因,比如网络连接出现问题
- 更多的是程序编写错误,比如空指针异常等
2. 怎样理解异常这个概念
- 这些非正常情况在 Java 中统一被认为是异常,Java 使用异常机制来统一处理
- 异常是相对于
return
的一种退出机制,可以由系统触发,也可以由程序通过throw
语句触发 - 异常可以通过
try/catch
语句进行捕获并处理。如果没有捕获,则会触发默认处理机制,即输出异常栈信息并退出程序。异常有不同的类型
3. 发生空指针异常时,具体发生了什么
- JVM 发现对象引用为
null
时,没有办法继续执行了,这时就启用异常处理机制,首先创建一个异常对象,这里是类NullPointerException
的对象,然后查找看谁能处理这个异常。如果没有代码可以处理这个异常,那么 Java 会启用默认处理机制,即打印异常栈信息到屏幕,并退出程序 - 异常栈信息就包括了从异常发生点到最上层调用者的轨迹,还包括行号,可以说,这个栈信息是分析异常最为重要的信息
- Java 的默认异常处理机制是退出程序,异常发生点后的代码都不会执行
4. throw
关键字的含义
throw
的意思是抛出异常,它会触发 Java 的异常处理机制- 在比如说空指针异常中,我们没有看到
throw
的代码,可以认为throw
是由 JVM 自己实现的
5. 对比一下 throw
关键字和 return
关键字
return
代表正常退出;throw
代表异常退出return
的返回位置是确定的,就是上一级调用者;throw
后执行哪行代码则经常是不确定的,由异常处理机制动态确定
6. 异常处理机制的流程
- 异常处理机制会从当前函数开始查看谁“捕获”了这个异常,当前函数没有就查看上一层,直到主函数。如果主函数也没有,就使用默认机制,即输出异常栈信息并退出
- “捕获”是指使用
try/catch
关键字,try
后面的花括号{}
包含可能抛出异常的代码 - 捕获异常后,程序就不会异常退出了,但
try
语句内异常点之后的其他代码就不会执行了,执行完catch
内的语句后,程序会继续执行catch
花括号外的代码