一、 java中的异常处理
将异常本身作为一个对象,产生异常就是产生一个异常对象。
该异常对象中包括了异常事件的类型,发生异常时应用程序的状态和调用过程。
可以将程序逻辑与异常处理分开编写。
二、异常的分类
(1)受检异常:在编译时就能被java编译器检测到。
(2)非受检异常:不能在编译时检测到,包括:运行时异常(Runtime Exception);错误(Error)。
三、Error
动态链接失败,虚拟机错误等。通常Java程序不应该捕获这类异常,也不会抛弃这种异常。
四、Exception
(1)运行时异常:继承于RuntimeException的类都属于运行时异常。
(2)非运行时异常--受检异常:除了运行时异常之外的其他由Exception继承来的异常类都是非运行时的异常,都是受检异常。Java编译器要求在程序中必须处理这种异常: 捕获异常或者声明抛弃异常。
(3)throw:用户自己定义的异常。
五、处理异常
java语言中有两种异常处理机制:捕获异常;声明抛弃异常。
六、方法一:捕获异常
捕获异常是通过 try-catch-finally 语句实现的。
try{
...... //常规的代码
[throw ...]
} catch( ExceptionName1 e ) {
...... //处理异常1
} catch( ExceptionName2 e ) {
...... //处理异常2
}
......
finally{
...... //不论发生什么异常(或者不发生任何异常),都要执行的部分
}
七、try
用try{…}选定捕获异常的范围。
在try{…}这一部分,存放常规的代码,或可能出错的代码段。
该代码块中的语句在执行过程中可能会生成异常对象并抛出。
如果发生了异常,则try语句块中剩下的代码将会跳过。
八、catch
每个try代码块可以伴随一个或多个catch语句块,用于处理try代码块中所生成的异常事件。
catch后跟一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类。
Jdk7允许捕获多个异常:catch( Type1 | Type2 | Type3 e)
例如:
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
九、捕获异常的顺序
try后跟的若干catch语句块可以捕获若干种异常,捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。
因此,在安排catch语句的顺序时:首先应该捕获最特殊的异常,然后再逐渐一 般化。也就是一般先安排子类,再安排父类。
十、finally
不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。
若程序在try语句块之前调用了System.exit 方法退出,则不会执行finally。
由于finally语句块几乎总是会执行,因此可用于保护资源免于泄漏。
try {
对文件进行处理的程序;
} catch(IOException e) {
//对文件异常进行处理;
} finally {
不论是否发生异常,都关闭文件;
}
十一、方法二:声明抛弃异常
(1)使用throws关键字抛弃异常
当一个类/方法中有异常被抛出了,就要做处理(try-catch)。
但有时候一个类/方法中产生了异常,却不知道该怎么处理它,此时可对类/方法的头部使用throws关键字声明要抛弃的异常,当有异常抛出时就中断该方法,将异常抛到这个方法的调用者那里。
eg.public static void main(String args[]) throws IOException,IndexOutOfBoundsException {…}
栈解退:当抛出了异常,但还没有在特定的作用域中被捕获时,方法调用栈便被“解退”, 并试图在下一个外层try语句块中捕获这 个异常,此过程被称为“栈解退”。 此时抛出未捕获异常的方法将终止,这个方法中所有的局部变量都将超出作用域, 控制会返回到最初调用这个方法的语句。
(2)使用throw语句将异常抛弃
在java代码中如果发生异常的话,jvm会抛出异常对象,导致程序代码中断,这个 时候jvm做的操作就是:创建异常对象,然后抛出。
但是有时候有些错误在jvm看来不是错误,例如年龄是负数,此时我们需要自己手动创建异常对象,并抛出该异常对象,这就是throw的作用。
可以抛弃的异常必须是Throwable或其子类的实例。
eg. IOException e=new IOException(); throw e;
用户自定义异常:用户定义的异常类型必须是 Throwable 的直接或间接子类。Java 推荐用户的异常类型以 Exception 为直接父类。(即extends Exception)
链式异常:抛出一个新的异常,将捕获的初始异常作为第二实参,这种方法可以使得新异常抛出时,异常对象 能包含来自于原始异常的完整的栈踪迹信息。(eg.throw new Exception( "Exception thrown in method2", exception ) )
十二、小结:处理异常的常用方法
(1) 一旦捕获异常,马上进行处理
(2) 重新抛出异常
(3) 捕获异常,但并不处理
(4) 通过语句System.exit()退出应用程序
十三、单体程序设计模式
单体模式的特点:
(1)单体类只能有一个实例。
(2)单体类必须自己创建自己的唯一实例。
(3)单体类必须给所有其他对象提供这一实例。
// 单体类实现例程。
public class J_Singleton {
private static J_Singleton m_object = new J_Singleton( );
// 定义构造方法: 不允许自行创建这个类的实例对象
private J_Singleton( ) {
} // J_Singleton构造方法结束
// 返回单体实例对象的引用
public static J_Singleton mb_getObject( ) {
return m_object;
} // 方法mb_getObject结束
} // 类J_Singleton结束
//单体类Runtime
public class Runtime {
private static Runtime currentRuntime = new Runtime( );
public static Runtime getRuntime( ) {
return currentRuntime;
}
/** Don't let anyone else instantiate this class */
private Runtime( ) {
}
// ... ...
}