一:Error和Exception的基本概念:
首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类,Exception和Error体现了JAVA这门语言对于异常处理的两种方式。
Exception 是程序正常运行过程中可以预料到的意外情况,并且应该被开发者捕获,进行相应的处理。
Error是java程序运行中不可预料的异常情况(正常情况下不大可能出现的情况),这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误 ,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。 Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。】
其中的Exception又分为检查性异常(checked)和非检查性异常(unchecked)。两个根本的区别在于,检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。
切记,Error是Throw不是Exception 。
二者的不同之处(小总结):
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
Error:
1.总是不可控制的(unchecked)。
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。
如下是常见的 Error 和 Exception:
1)运行时异常(RuntimeException)也称 【非检查型异常 UncheckedException】:
NullPropagation:空指针异常;
ClassCastException:类型强制转换异常
IllegalArgumentException:传递非法参数异常
IndexOutOfBoundsException:下标越界异常
NumberFormatException:数字格式异常
ArrayIndexOutOfBoundsException: 数组越界异常
ArrayStoreException: 数据存储异常,操作数组时类型不一致
AruthmeticException: (算术异常)
BufferOverflowException: (缓冲区溢出异常)
2)非运行时异常(CheckedException)也称 【检查型异常】:
ClassNotFoundException:找不到指定 class 的异常
IOException:IO 操作异常
FileNotFoundException:文件不存在异常
SQLException:SQL语句异常
InterruptedException: (中断异常-调用线程睡眠时候)
3)错误(Error):
NoClassDefFoundError:找不到 class 定义异常
StackOverflowError:深递归导致栈被耗尽而抛出的异常
OutOfMemoryError:内存溢出异常
eg(代码示例01) 下面代码会导致 Java 堆栈溢出错误。/ 通过无限递归演示堆栈溢出错误 class StackOverflow { public static void test(int i) { if (i == 0) { return; } else { test(i++); } } } public class ErrorEg { public static void main(String[] args) { // 执行StackOverflow方法 StackOverflow.test(5); } }