异常(exception)

来源:互联网 发布:交友软件下载 编辑:程序博客网 时间:2024/06/08 07:37

异常exception:

JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException.另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。

 

所有的异常都是java.lang.Thowable的子类,它们分为两类:exception和error,而exception又分为RuntimeExceptionCheckedException. CheckedException必须要求有对应的“异常处理模块”, 也即是说,如果你在程序中 throw 出一个异常,那么在你的程序中(函数中)就必须要 catch 这个异常(处理这个异常)。但是,对于 RuntimeException 和 Error 这两种类型的异常(以及它们的子类异常),却是例外的,你不需要在你的程序中显性的声明,抛出,捕获,处理该异常。其中, Error 表示 Java 系统中出现了一个非常严重的异常错误;而 RuntimeException 虽然是 Exception 的子类,但是它却代表了运行时异常。

 

Java 异常处理模型中引入了 try-finally 语法,它主要用于清理非内存性质的一些资源(垃圾回收机制无法处理的资源),例如,数据库连接、 Socket 关闭、文件流的关闭等。

import java.io.*;

public class Trans

{

public static void main(String[] args)

{

try

{

BufferedReader rd=null;

Writer wr=null;

try

{

File srcFile = new File((args[0]));

File dstFile = new File((args[1]));

rd = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), args[2]));

wr = new OutputStreamWriter(new FileOutputStream(dstFile), args[3]);

while(true)

{

String sLine = rd.readLine();

if(sLine == null) break;

wr.write(sLine);

wr.write("/r/n");

}

}

finally

{

// 这里能保证在何种情况下,文件流的句柄都得以被正确关闭

// 该方法主要用于清理非内存性质的资源(垃圾回收机制无法

// 处理的资源,如数据库连接、 Socket 关闭、文件关闭等等)。

wr.flush();

wr.close();

rd.close();

}

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

}

 

如果一个函数中,它运行时可能会向上层调用者函数抛出一个异常,那么,它就必须在该函数的声明中显式的注明(采用 throws 关键字)。

只要一个方法关联了"异常",可以将这个"异常"关联向上传递,但是最终必须使用catch来终止"异常",或者一直传递到main()方法交给Java虚拟机来结束"异常"对象的生命,否则是通不过编译的。

"异常"对象从产生点产生后,到被捕捉后终止生命的全过程中,实际上是一个传值过程,所以你可以根据需要,来合理的控制检测到"异常"的粒度。例如,如果你并不需要知道具体产生的是何种具体的"异常",那么你可以使用"异常"的公共父类Exception来结合"异常"对象,即catch(Exception e){…}。同样在"异常"与方法关联的传递过程中,也可以根据需要控制关联"异常"的粒度,即throws后面跟上异常对象的父类名。

代码实例:

// 示例程序 1 ,这种写法能够编译通过

import java.io.*;

public class Trans

{

public static void main(String[] args)

{

try

{

test();

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

static void test()

{

try

{

throw new Exception("test");

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

}

// 示例程序 2 ,这种写法就不能够编译通过

import java.io.*;

public class Trans

{

public static void main(String[] args)

{

try

{

test();

}

// 虽然这里能够捕获到 Exception 类型的异常

catch(Exception ex)

{

ex.printStackTrace();

}

}

static void test()

{

throw new Exception("test");

}

}

// 示例程序 3 ,这种写法又能够被编译通过

import java.io.*;

public class Trans

{

public static void main(String[] args)

{

try

{

test();

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

// 由于函数声明了可能抛出 Exception 类型的异常

static void test() throws Exception

{

throw new Exception("test");

}

}

// 示例程序 4 ,它又不能够被编译通过了

import java.io.*;

public class Trans

{

public static void main(String[] args)

{

try

{

// 虽然 test() 函数并没有真正抛出一个 Exception 类型的异常

// 但是由于它函数声明时,表示它可能抛出一个 Exception 类型的异常

// 所以,这里仍然不能被编译通过。

test();

}

catch(IOException ex)

{

ex.printStackTrace();

}

}

static void test() throws Exception

{

}

}

 

 

相关文档:

java异常处理模型: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1010609

Java中异常机制的深层原理探讨:

http://www.yuantiao.com.cn/2005-11-10/1131587929861.html

原创粉丝点击