错误处理机制是几乎每个现代程序语言都具备的能力。
错误是指程序运行中出现的各种影响程序不可正常运行下去的状况,如内存不够用,类找不到,文件找不到、网络连接失败、数据类型转换失败等。
接口Throwable表明了Java中代码,所有错误都是可抛出的,即当错误发生时,错误可以自己处理也可以被抛到上层即调用层来处理,类似事件传播机制。
错误又具体分为两类,Error和Exception,它们的区别是:
Error是指程序无法处理的错误,表示运行应用程序中较严重问题,如OutOfMemoryError,NoClassDefFoundError
Exception是指程序可以处理的错误,它又分为不必查异常和必查异常。
所有RuntimeException及其子类,都为不必查异常,如NullPointerException,ArrayIndexOutOfBoundException。之所以被称为“不必查”,是因为编译器并不会强制要求你必须使用try catch语句捕获它,也不会要求你必须抛出它。为什么定义他们“不必查”是因为它们可能出现的场景太频繁了,因此希望程序员自己添加逻辑避免它的发生(难道这样就不麻烦?)。虽说名为“不必查”,可现实却是,一旦你没有检查到它,在它发生后,你却又没有捕获它,它会自动向上抛出,直到抛出到最上层,中断当前线程。没有一个程序,特别是用于响应用户请求的单线程程序,会希望仅仅其中一个用户响应处理过程中出现了异常,就草草终止了整个程序。所以大家都会在程序的最外层,添加try catch,以保护主程序永远活着,除非手动关了它。
Exception及其他子类,为必查异常,如IOException、SQLException等。编译器要求你必须处理它,或抛到上层处理它。必查异常是假定你捕获到这类异常后后,可以做些什么,恢复现场,并让程序继续向下运行。可现实却是,某些必查异常出现后,你并不能干些什么,只是打个log或告诉用户,操作失败。这时最好的做法是,抛出自定义的RuntimeException,在最外层try catch,统一处理。由于RuntimeException是不需要手动抛出的,因此代码会更简洁。