java中所有“异常和错误”的基类
java.lang.Throwable
java.lang.Exception
java.lang.Error
它们之间的关系如下图:
Error 和 Exception
Error:一般是内部错误,一旦发生就无法挽回,所以就只能终止程序的运行。
例如:空指针、资源枯竭
Error分类:用户输入错误,设备错误,物理限制
Error举例:
VirtualMachineError 虚拟机坏了或者资源枯竭
OutOfMemoryError 内存告罄
StackOverflowError 爆栈
InternalError 意想不到的内部错误
LinkageError 描述在依赖关系中的错误
NoClassDefFoundError 一个类的实例引用了一个不存在的类
Exception:是程序的问题,可以捕获和处理
注:在这里请注意区分checked、unchecked问题和error、exception问题的区别
Exception分类:RuntimeException(是你的编程问题)和其他异常(外部问题,比如文件格式不正确,IO无法读取,其实说到底还是程序问题)
checkedException uncheckException
在静态检查时被要求进行处理,包括除了RuntimeException之外的所有异常
在静态检查时不要求处理,在运行时发现错误直接(这些异常和错误认为是发现以后,程序肯定不能继续运行了,所以会直接退出),包括Error + RuntimeException
常见的uncheckException:
ArrayIndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
NumberFormatException(数据格式错误)
ClassCastException(不能向下强转)
IllegalArgumentException(函数不合法的参数)
IllegalStateException(当前程序状态不适合该函数调用)
NoClassDefFoundError(找不到类的声明)
如何选择使用checkedException还是uncheckException?
- 如何客户端可以通过其他方法进行回复就使用checked类型的,否则就是unchecked类型的。
- 如果client仅仅想看到异常信息,可以简单抛出一个unchecked exception:
throw new RuntimeException(“Username already taken”); - 从checked exception中获取异常返回的信息来明确操作失败的 因。
java实现异常处理机制
throws指的是该方法可能会抛出某个异常
举个例子:
public static void func(String args[]) throws IOException, EOFException {}
那么调用这个函数的函数就要处理相应的异常
throw在程序中主动的抛出异常
经常用于自己编写的异常,以便于进行check
try catch finally处理异常
twr技术
异常在继承中的体现
- 如果子类型中重写了夫类型中的方法,那么子类型的中的方法抛出的异常不能比父类型中抛出的异常更加宽泛
- 子类型可以抛出更加具体的异常,也可以不抛出任何异常
- 如果父类型中没有抛出任何异常,那么子类型中也不能抛出任何异常
异常使用的建议
- 避免不必要的异常检查
- 尽量多使用标准异常
- 不要声明unchecked exceptions
- 详细包含故障捕获信息
- 不要忽视异常(catch-clause里面没有东西)