Java读书笔记--Java异常处理

来源:互联网 发布:java -d 编辑:程序博客网 时间:2024/06/06 09:04

异常(Exception)是程序在运行过程中由于硬件设备问题软件设计错误缺陷等导致的程序错误。

(1)想打开的文件不存在。

(2)网络连接中断。

(3)操作数超出预定范围。

(4)正在装载的类文件丢失。

(5)访问的数据库打不开。


Java编程语言中,产生异常就是产生一个异常对象

这个对象可能由应用程序本身产生,也可能由Java虚拟机产生,这取决于产生异常的类型。

该异常对象中包括了异常事件的类型以及发生异常的应用程序目前的状态调用过程


import java.io.*;public class Exception1 {public static void main(String args[]){FileInputStream fis=new FileInputStream("text.txt");int b;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}

上述程序在编译成二进制代码之前就出现3个错误,他们是由java.io.FileNotFoundExceptionjava.io.IOException这两个异常引发的。


public class Exception2 {public static void main(String args[]){String langs []={"Java","Visaul Basic","C++"};int i=0;while(i<4){System.out.println(langs[i]);i++;}}}

上述程序编译可以通过,但运行时出现异常信息被抛出。java.lang.ArrayIndexOutOfBoundsException


public class Exception3 {public static void main(String args[]){int a=0;System.out.println(5/a);}}

编译上述代码得到其字节码文件,然后运行出现除以0溢出的异常事件。java.lang.ArithmeticException:/byZero


 可以看出,对于某些异常,在程序中必须对它进行处理,否则编译程序会指出错误。但对于另一些异常,在程序中可以不做处理,而直接在运行时由系统来处理。


Java异常处理机制:


(1)捕获异常:


在Java程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。
找到能够处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(Catch)异常。
如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应地,Java程序也将退出。


(2)声明异常:


当Java程序运行中系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在该方法声明时,声明抛弃(Throws)异常。




对于运行时异常,Java编译器允许程序不对它们做出处理,
对于非运行时异常,则要求程序必须做捕获或声明抛弃处理,否则是无法通过程序编译的。




捕获异常是通过try-catch-finally语句实现的。


(1)try{}选定捕获异常的范围。
(2)catch块中的代码用来对异常对象进行处理。
(3)finally语句为异常处理提供一个统一的出口。


具体来说:
(1)每个try代码块可以伴随一个或多个catch语句。
(2)catch语句只有一个形式参数,用来指明它所能够捕获的异常类型。
(3)抛出的异常必须是Throwable或其子类的实例。
(4)catch块中可以访问一个异常对象的变量或调用它的方法。
getMessage()用来得到有关异常事件的信息。
printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。
(5)当捕获到一个异常时,剩下的catch语句就不再进行匹配。
首先应该捕获最特殊的异常,然后再逐渐一般化。即一般先安排子类,再安排父类。
(6)finally语句一般是用来关闭文件或释放其他的系统资源。
(7)finally语句在程序中是可选的。

(8)存在finally语句时,无论try块中是否发生了异常,是否执行过catch语句,都要执行finally语句。

(9)try-catch-finally语句可以嵌套。


import java.io.*;public class Exception5 {public static void main(String[] args){try{FileInputStream fis=new FileInputStream("text.txt");int b;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}catch(FileNotFoundException e){System.out.println(e);System.out.println("Message:"+e.getMessage());e.printStackTrace(System.out);}catch(IOException e){System.out.println(e);}}}



在一个方法中生成了一个异常且该方法不知道如何处理这一异常,该方法应该声明抛弃异常。


声明抛弃异常是在一个方法声明的throws子句中指明。
throws子句中同时可以指明多个异常,之间由逗号隔开。


import java.io.*;public class Exception4 {public static void main(String[] args)throws FileNotFoundException,IOException{FileInputStream fis=new FileInputStream("text.txt");int b;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}


如果text.txt文件存在,并内容正常,那么程序可以正常运行。
如果text.txt文件不存在或有其他问题,那么程序出现的异常将被提交给虚拟机处理。



try-catch-finally嵌套例子。



class MyoneException extends Exception{}public class TryInbed {public static void main(String[] args){System.out.println("Entering first try block");try{System.out.println("Entering second try block");try{throw new MyoneException();}finally{System.out.println("finally in 2nd try block");}//try-catch-finally 嵌套在try限定范围内}catch(MyoneException e){System.err.println("Caught MyoneException in 1st try block");}finally{System.out.println("finally in 1st try block");}}}


用户自定义异常类,推荐以Exception为直接父类。


0 0
原创粉丝点击