1.异常分类
所有的异常类是从 java.lang.Exception 类继承的子类。
Throwable是Java语言中所有错误或异常的超类。下一层分为Error和Exception
Error类是指Java运行时系统的内部错误和资源耗尽错误。例如,JVM 内存溢出。一般地,程序不会从错误中恢复。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。
Exception又有两个分支:
一个是运行时异常RuntimeException,如:NullPointerException、ClassCastException;RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。派生RuntimeException的异常一般包含几个方面:错误的类型转换、数组访问越界、访问空指针
一个是检查异常CheckedException,如I/O错误导致的IOException、SQLException;这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行try catch,该类异常一般包括几个方面:试图在文件尾部读取数据、试图打开一个错误格式的URL、试图根据给定的字符串查找class对象,而这个字符串表示的类并不存在。
java中的checked exception:
java.long中的unchecked exception:
1.处理checked异常
1.1try-catch-finally
try-catch
捕获异常的第一步是用try{…}语句块选定捕获异常的范围, 将可能出现异常的代码放在try语句块中。在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常处理,一旦处理完成就跳出当前的try-catch结构(在没有写finally的情况下)。继续执行其后的代码。在try结构中声明的变量,出了try结构之后,就不能被调用。
在catch语句块中是对异常对象进行处理的代码。 每个try语句块可以伴随一个或多个catch语句, 用于处理可能产生的不同类型的异常对象。catch中的异常类型如果没有子父类关系,则声明顺序无所谓,如果异常类型满足子父类的关系,则要求子类一定要声明在父类的上面,否则报错。
finally
捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
不论在try代码块中是否发生了异常事件, catch语句是否执行, catch语句是否有异常, catch语句中是否有return,finally块中的语句都会被执行。
finaly中声明的是一定会被执行的代码,即使catch中出现了异常,try中有return语句,catch中有return语句等情况。
finally语句和catch语句是任选的。
像数据库连接,输入输出流,网络编程socket等资源,JVM是不能自动回收的,我们需要手动的进行资源的释放。此时的资源的释放,就需要声明在finally中。
1.2throws,throw
声明抛出异常是Java中处理异常的第二种方式
throws +异常类型
写在方法的声明处,此时此方法执行时, 可能会抛出的类型。
如果一个方法(中的语句执行时)可能生成某种异常, 但是并不能确定如何处理这种异常, 则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表, throws后面的异常类型可以是方法中产生的异常类型, 也可以是它的父类。
一旦方法体执行时,出现异常,仍会在异常代码处,生成一个异常类的对象,此对象满足throws后异常类型是,就会被抛出。异常代码后续的代码不再执行。
throw
手动抛出异常,java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出, 也可根据需要使用人工创建并抛出。
首先要生成异常类对象, 然后通过throw语句实现抛出操作。throw的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉,而将异常交给方法的调用者的地方处理。
2.处理unchecked异常
unchecked异常在编译时不会检查,这意味着即使你没有声明或者处理异常你的程序也会抛出一个unchecked异常,程序不会给出一个编译错误,大多数情况下这些异常的发生是由于用户在交互过程中提供的坏数据。这需要程序员提前去判断这种能够产生这种异常的情况并且恰当的处理它。
unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做。
unchecked exception不用使客户端代码显式的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。
充分利用Java API中提供的丰富unchecked exception,如NullPointerException , illegalArgumentException和illegalStateException等,使用这些标准的异常类而不需亲自创建新的异常类,使代码易于理解并避免过多消耗内存。