【后续内容:异常、集合、常用类,其实都是在面向对象的基础上,(即:我们需要解决一个实际的问题,Java为我们提供了一套API,API中可能有很多类、接口,它们之间有复杂的继承、实现关系),我们要做的就是学习这些类、接口,他们之间的关系,以及他们当中的一些方法】
一、异常概述:
-
异常:程序执行过程中的"不正常"情况,(开发过程中的语法错误、逻辑错误,不算异常)
【编写代码的过程中,不可能一点bug不出,很多问题并不是靠编码就能解决的,比如:用户输入的格式不对(整型故意或无意输错成String型),读取的文件不存在(误删了),网络是否保持畅通(断网了)】 -
错误分两类:
- Error:Java虚拟机也无法解决的严重问题,如:JVM系统内部错误(虚拟机自己都崩了)、资源耗尽等严重情况,这种问题一般不专门编写新代码来处理;
【解决不了,必须回头重写对应部分的源代码】
【例如:栈溢出 StackOverflowError,堆溢出 OutOfMemoryError(OOM)】 - Exception:其他因编程错误或偶然的外因造成的一般性问题,这种问题可以通过编写针对性的代码来处理;
【例如:空指针异常、试图读取的文件不存在、网络连接中断、数组下标越界】
- Error:Java虚拟机也无法解决的严重问题,如:JVM系统内部错误(虚拟机自己都崩了)、资源耗尽等严重情况,这种问题一般不专门编写新代码来处理;
【平时所说的异常都是Exception,因为Error是无法处理的严重错误,不考虑去专门处理,也处理不了,只能去重写错误源码】
public static void main(String[] args) {
//栈溢出:java.lang.StackOverflowError
main(args); //递归调用,没有出口
//堆溢出:java.lang.OutOfMemoryError
int[] arr = new int[1024 * 1024 * 1024];
//空指针异常:java.lang.NullPointerException
String str = null;
System.out.println(str.charAt(0));
}
- 两种解决方案:
- 遇到错误,直接终止程序(即:啥也不做);
- 提前考虑到错误的检测、错误消息的提示,以及解决方案
【就像:出去旅游,途中生病了,①直接躺了,啥也干不了了;②或者提前考虑到可能感冒、肚子疼,带好了药,如果途中没生病,更好,如果生病了,该吃药吃药】
- 异常(Exception)的分类:
- 编译时异常:
- 运行时异常:
【处理错误的最佳时期是编译时,但有些错误只有在运行时才会发生(比如:除数为0,数组下标越界)】
二、异常体系结构
【图中Exception的子类中:红色为编译时异常,蓝色为运行时异常】
补充:面试题:常见异常都有哪些?举例说明
* java.lang.Throwable
* |-----java.lang.Error:(一般不处理)
* |-----java.lang.Exception:(需要处理)
* |-----编译时异常(checked)【编译就不通过,提示"未处理xxx异常"(比如使用FileInputStream时,不try-catch,就会报错,提示没处理FileNotFoundException),单纯的语法写错了不叫编译时异常】
* |-----IOException
* |-----FileNotFoundException
* |-----ClassNotFoundException
* |-----运行时异常(unchecked,RuntimeException)
* |-----NullPointerException
* |-----ArrayIndexOutOfBoundsException
* |-----ClassCastException
* |