异常
在进行编写代码时,有的异常是不能避免的,如读取的文件不存在,或输入的数据格式不匹配都会导致异常的发生,异常机代表一种错误,又代表一种信息,遇到不是代码问题产生的不正常的现象,程序需要将这种异常的情况包装起来,告知用户,由用户来决定如何处理
异常的结构
所有的异常都是继承Throwable类而来的
Error
程序无法处理的错误,比如当JVM执行操作时没有需要的内存时,会出现OutofMemoryError,这种情况发生时,虚拟机会选择线程终止
常见的Error
- OutofMemoryError
- StackOverflowError
OutofMemoryError:当循环无出口,不断创建对象时,会出现此错误
- 内存溢出:对象本应该活着,但因为堆内存不够了,不能存活
- 内存泄漏:对象本应该回收,但因为泄露了,无法回收
public class TestOOMEoor {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
//此时应该是OOM的内存泄漏:无用对象无法被回收
while (true){
list.add(new OOMObject());
}
}
}
注意:在运行此段代码前可以通过参数制定内存大小
StackOverflowError:请求的栈深度超出JVM允许的栈深度
public class TestSOFError {
private int stackDeep = 0;
public void setDeep() {
stackDeep++;
setDeep();
}
public static void main(String[] args) {
TestSOFError testSOFError = new TestSOFError();
try{
testSOFError.setDeep();
}catch (Throwable t){
t.printStackTrace();
System.out.println("Call deep"+testSOFError.stackDeep);
}
}
}
Exception
- RuntimeException:运行时异常
- IOException:I/O错误导致的异常
常见的运行时异常:
- ArrayIndexOutOfBoundsException:数组下标越界异常(左右都可能越界)
- NullPointerException:空指针异常
- ArithmeticException:算术异常(例如除0异常)
- NumberFormatException:数字格式转化异常(非数字类型的字符串转化为数字类型)
- IllegalArgumentException:参数非法异常
- ConcurrentModifyException:并发修改异常(fail-fast)
常见的IO异常:
- FileNotFoundexception
受查异常和非受查异常:
- 受查异常(编译时期异常):受查异常的发生是可以预测的,可以在编写代码时期进行处理,如I/O异常,除了RuntimeException及其子类,都是受查异常
- 非受查异常:运行时异常,RuntimeException及其子类,这种异常是无法预先进行处理的