Bootstrap

Exception异常

ABC

都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。

  1. RuntimeException,也就是运行时异常,表示你的代码本身存在BUG,比如你提到的ArrayIndexOutOfBoundsException数组下标越界,这个属于代码有问题,数组定义的长度不够实际使用,不处理肯定会报错,如果你操作某个模块发现能正常运行,那只是因为代码还没跑到这个错误的地方而已。。控制台一旦报RuntimeException,就必须要处理。。没有例外的。而且,处理RuntimeException,不是try-catch能解决的。try-catch在这里使用毫无意义。try-catch用在这里作用就是代码运行过程中,不会直接在界面产生令人恐慌的错误,因为catch后已经给出产生错误后要输出的结果。但是bug依旧存在。处理RuntimeException使用抛出异常,throws(方法)或者throw(代码块),交给jvm来处理

  2. 不是RuntimeException,就是编译时异常,异常这两种了。比如你在处理文件流时的I/O问题和SQL异常,就属于编译时异常。这个时候用try{}catch 来捕获或者 throws即可
    编译时异常其实是可以这么理解你的代码本身没有问题运行时异常是你的代码本身有问题),但是代码里如果含有处理文件流(这里只是举个例子,还有很多类似的其它的情况)的时候,java规定,遇到这种情况,必须要在代码里强制抛出可能遇到的文件流异常,你可以在方法开头就throws,或者在catch后面进行捕获。其实代码本身逻辑跟语法都是没问题,但是文件流这种操作本身会存在潜在的问题与风险,这种问题是与你的代码无关的,java会强制要求在代码里作出预期处理。也就是刚才说的要么在方法开头就throws可能遇到的文件异常,要么就去catch后面捕获具体的文件异常。如果你在代码里不做这样的处理,运行代码后,控制台就会输出错误。代码一样跑不起来。
    error,包括OutOfMemoryError、ThreadDeath

运行时异常可以理解为隶属于开发者的问题,代码有bug肯定要开发者自己修正啊。编译时异常可以理解为隶属于用户的问题,用户用的时候没有按照要求来,我就catch住,提示他们。比如,如果我们页面文本提示要输入一个数字,在后台要用new Long(text);转化成整型,但是用户偏偏不输入数字,而是输入一个“abc”,这个时候我们就在这段代码上catch一个类型不匹配的异常,提示用户。

;