都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。
-
RuntimeException,也就是运行时异常,表示你的代码本身存在BUG,比如你提到的ArrayIndexOutOfBoundsException,数组下标越界,这个属于代码有问题,数组定义的长度不够实际使用,不处理肯定会报错,如果你操作某个模块发现能正常运行,那只是因为代码还没跑到这个错误的地方而已。。控制台一旦报RuntimeException,就必须要处理。。没有例外的。而且,处理RuntimeException,不是try-catch能解决的。try-catch在这里使用毫无意义。try-catch用在这里作用就是代码运行过程中,不会直接在界面产生令人恐慌的错误,因为catch后已经给出产生错误后要输出的结果。但是bug依旧存在。处理RuntimeException使用抛出异常,throws(方法)或者throw(代码块),交给jvm来处理
-
不是RuntimeException,就是编译时异常,异常这两种了。比如你在处理文件流时的I/O问题和SQL异常,就属于编译时异常。这个时候用try{}catch 来捕获或者 throws即可。
编译时异常其实是可以这么理解:你的代码本身没有问题(运行时异常是你的代码本身有问题),但是代码里如果含有处理文件流(这里只是举个例子,还有很多类似的其它的情况)的时候,java规定,遇到这种情况,必须要在代码里强制抛出可能遇到的文件流异常,你可以在方法开头就throws,或者在catch后面进行捕获。其实代码本身逻辑跟语法都是没问题,但是文件流这种操作本身会存在潜在的问题与风险,这种问题是与你的代码无关的,java会强制要求在代码里作出预期处理。也就是刚才说的要么在方法开头就throws可能遇到的文件异常,要么就去catch后面捕获具体的文件异常。如果你在代码里不做这样的处理,运行代码后,控制台就会输出错误。代码一样跑不起来。
error,包括OutOfMemoryError、ThreadDeath等
运行时异常可以理解为隶属于开发者的问题,代码有bug肯定要开发者自己修正啊。编译时异常可以理解为隶属于用户的问题,用户用的时候没有按照要求来,我就catch住,提示他们。比如,如果我们页面文本提示要输入一个数字,在后台要用new Long(text);转化成整型,但是用户偏偏不输入数字,而是输入一个“abc”,这个时候我们就在这段代码上catch一个类型不匹配的异常,提示用户。